繁体   English   中英

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

[英]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

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

如果您临时保存模型以在另一种方法中使用它,则应改用 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 服务器的内存中,为了在应用程序池重置的情况下不丢失会话变量,您可以将状态模式更改为StateServerSQLServer ,这提供了一种解决方案,可以在以下情况下保留会话状态Web 应用程序重新启动。

详细参考: https : //msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM