我应该在asp.net MVC中存储我的临时视图模型?

时间:2017-08-16 20:54:06

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我创建了一个页面,用户可以从随机问题中选择答案。

控制器包含

 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

我该如何解决这个问题? 我尝试使用ViewBagViewData,因为我不想使用公共静态属性。

2 个答案:

答案 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