[英]Where should i store my temporary view model in asp.net MVC?
我创建了一个页面,用户可以在其中从随机问题中选择一个答案。
控制器包含
public class TestController : Controller
{
private DBDataContext _context;
private HomeViewModel _model;
public TestController()
{
_context = new DBDataContext();
_model = new HomeViewModel();
}
// GET: Test
[Route("test-online")]
public ActionResult Index()
{
_model = new HomeViewModel()
{
Categories = _context.Categories.Select(x => x.ToCategories()).ToList(),
QuestionModel = new List<QuestionModel>()
};
ViewData.Model = _model;
return View(_model);
}
[HttpPost]
public void Go(Test t)
{
_model = (HomeViewModel)ViewData.Model;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (_context != null)
{
_context.Dispose();
_context = null;
}
}
base.Dispose(disposing);
}
}
问题是我应该在哪里存储我的_model
?
当用户选择答案时,会在Go
方法上执行 ajax 发布,但不幸的是ViewData.Model
现在为null
我该如何解决这个问题? 我尝试了ViewBag
和ViewData
因为我不想使用公共静态属性。
如果您临时保存模型以在另一种方法中使用它,则应改用 TempData。
使用 TempData 代替 Index 方法中的 ViewData。 例如:
TempData["myModel"] = _model;
您可以通过使用在 Go 方法中检索相同的内容
_model = TempData["myModel"];
请记住,TempData 将只保存一个请求的数据。 如果您希望数据持久保存多个请求,则需要使用 TempData.peek 和 TempData.keep。 你可以从下面的链接中找到它是什么
https://hassantariqblog.wordpress.com/2016/09/02/mvc-when-to-use-keep-vs-peek-in-asp-net-mvc/
您可以像以下代码一样通过Session
保留您的模型。
// 设置模型和会话的部分
var _model = new HomeViewModel()
{
Categories = _context.Categories.Select(x => x.ToCategories()).ToList(),
QuestionModel = new List<QuestionModel>()
};
Session["model"] = _model;
// 获取模型和会话的部分
HomeViewModel model = null;
if(Session["model"] != null)
{
model = Session["model"] as HomeViewModel;
// your code here
}
应用程序池重置案例可以做什么来不丢失会话数据?
会话状态在inProc
模式下工作, inProc
模式默认将会话状态存储在 Web 服务器的内存中,为了在应用程序池重置的情况下不丢失会话变量,您可以将状态模式更改为StateServer
或SQLServer
,这提供了一种解决方案,可以在以下情况下保留会话状态Web 应用程序重新启动。
详细参考: https : //msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.