我创建了一个页面,用户可以从随机问题中选择答案。
控制器包含
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
,因为我不想使用公共静态属性。
答案 0 :(得分:3)
如果要临时保存模型以在其他方法中使用它,则应使用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/
答案 1 :(得分:1)
您可以通过Session
保留您的模型,如下面的代码。
//设置模型和会话的部分
_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
模式,默认情况下将会话状态存储在Web服务器的内存中,以便在应用程序池重置时不丢失会话变量,您可以将状态模式更改为StateServer
或{ {1}}提供了一种解决方案,可以在重新启动Web应用程序时保留会话状态。
详情参考:https://msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx