C# 在asp.net MVC中,我应该将临时视图模型存储在哪里?
我创建了一个页面,用户可以在其中从随机问题中选择答案 控制器包含C# 在asp.net MVC中,我应该将临时视图模型存储在哪里?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我创建了一个页面,用户可以在其中从随机问题中选择答案 控制器包含 public class TestController : Controller { private DBDataContext _context; private HomeViewModel _model; public TestController() { _context =
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);
}
}
公共类TestController:Controller
{
私有DBDataContext _context;
私有HomeViewModel _模型;
公共测试控制器()
{
_context=new DBDataContext();
_model=新的HomeViewModel();
}
//获取:测试
[路线(“在线测试”)]
公共行动结果索引()
{
_模型=新的HomeViewModel()
{
Categories=\u context.Categories.Select(x=>x.ToCategories()).ToList(),
QuestionModel=新列表()
};
ViewData.Model=\u Model;
返回视图(_模型);
}
[HttpPost]
公共无效Go(测试t)
{
_model=(HomeViewModel)ViewData.model;
}
受保护的覆盖无效处置(布尔处置)
{
如果(处置)
{
如果(_context!=null)
{
_context.Dispose();
_上下文=空;
}
}
基地。处置(处置);
}
}
问题是我应该把我的\u模型存放在哪里
当用户选择答案时,会在Go
方法上执行ajax post,
但不幸的是,ViewData.Model
现在是null
如何解决此问题?
由于我不想使用公共静态属性,因此我尝试了使用ViewBag
和ViewData
。如果您临时保存模型以在其他方法中使用它,则应改用TempData
使用TempData代替Index方法中的ViewData。例:
TempData["myModel"] = _model;
您可以在Go方法中使用
_model = TempData["myModel"];
请记住,TempData将只保存一个请求的数据。如果您希望数据为多个请求保留,则需要使用TempData.peek和TempData.keep。你可以从下面的链接中找到它
您可以通过会话
保留您的模型,如以下代码所示
//设置模型和会话的部分
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
}
在应用程序池重置情况下,可以做些什么以不丢失会话数据
会话状态在PROC
模式下工作,默认情况下,该模式将会话状态存储在Web服务器的内存中,为了在应用程序池重置时不丢失会话变量,您可以将状态模式更改为StateServer
或SQLServer
,这提供了一种在重新启动Web应用程序时保留会话状态的解决方案
详细信息参考:我应该问一下应用程序池重置时的数据会发生什么情况吗?当您深入了解TempData的工作原理时,它只不过是存储在会话中的一个易腐对象。因此,当您使用TempData时,如果您的应用程序池被重新设置或重置,数据可用性将完全取决于您使用的状态管理技术。。。@hsnbl在其评论中所说的内容也适用于这种情况。我是否应该询问应用程序池重置时的数据会发生什么情况?对于应用程序池重置情况,我建议更改会话状态模式。参考: