每个浏览器选项卡的 MVC 持久模型
Posted
技术标签:
【中文标题】每个浏览器选项卡的 MVC 持久模型【英文标题】:MVC Persist Model per Browser Tab 【发布时间】:2012-05-28 01:28:51 【问题描述】:我有一个 MVC 应用程序,但在使用现代多选项卡浏览器时遇到了问题。
我有一个创建模型并将其存储在 this.TempData["MyViewModel"]
中的屏幕然后我在第二个选项卡中打开同一个屏幕,并在它调用相同的控制器方法时再次设置 this.TempData["MyViewModel"]。
如果我随后返回选项卡 1 并刷新页面,我会看到在选项卡 2 中输入的数据。
有没有办法在 TempData 中为每个浏览器选项卡唯一地存储数据?
我曾想过创建一个唯一的 TempData 键并使用查询字符串或隐藏字段在请求之间持久保存它,但这看起来很混乱。
欢迎任何想法/建议。 :o)
到目前为止,我所拥有的是“ProcessID”的概念。
在我的第一个部分视图中,我有一个带有隐藏字段的表单,该字段松散地绑定到我的 Model.ProcessID。发布表单时,此隐藏字段 ProcessID 用作 TempData 键...
例子:
public sealed class MyViewModel
public MyViewModel()
this.ProcessID = Guid.NewGuid().ToString();
public string ProcessId get; set;
// other fields
局部视图 1:
@model Models.MyViewModel
@using (Ajax.BeginForm("PartialView1", "Home", new , new AjaxOptions() UpdateTargetId = "myDivToUpdate" , new ))
@html.HiddenFor(m => m.ProcessId);
// other fields...
<input type="submit" value="next" />
public ActionResult PartialView1(FormCollection form)
return this.PartialView("PartialView1", new Models.MyViewModel());
[HttpPost]
public ActionResult PartialView1(FormCollection form)
Models.MyViewModel vm = new Models.MyViewModel();
this.UpdateModel(vm, form);
this.TempData[vm.ProcessId] = vm;
return this.PartialView("PartialView2", vm);
在我的第二个局部视图表单中,我再次有一个隐藏字段松散地绑定到同一个 Model.ProcessID。发布此表单后,我可以使用 Model.ProcessID 从 TempData 检索我的视图模型并更新它:
局部视图 2:
@model Models.MyViewModel
@using (Ajax.BeginForm("PartialView2", "Home", new , new AjaxOptions() UpdateTargetId = "myDivToUpdate" , new ))
@Html.HiddenFor(m => m.ProcessId);
// other fields (different to partial view 1)...
<input type="submit" value="finish" />
[HttpPost]
public ActionResult PartialView2(FormCollection form, Models.MyViewModel vm)
vm = (this.TempData[vm.ProcessId] as Models.MyViewModel);
this.UpdateModel(vm, form);
return this.Json(new result = true, message = "success" , JsonRequestBehavior.AllowGet);
【问题讨论】:
为什么要将模型存储在Session
大不不!只是让您的选项卡位于局部视图中并通过 ajax 单击重新加载内容?就像你可以用 jQuery 选项卡做的那样,这样你就不会头疼了。
我正在使用 TempData,它仅在设置它的请求之后保留 1 个后续请求。我需要在几个控制器请求之间保留视图模型,所以这是 TempData 的理想选择。问题是,像 ViewData 这样的 TempData 是一个带有基于字符串的键的字典,如果将其硬编码为诸如“MyViewModel”之类的值,如果该选项卡也在查看同一页面,则该选项卡将被浏览器中的另一个选项卡覆盖。我需要的是每个选项卡唯一的 TempData 存储(或类似存储)。
【参考方案1】:
默认情况下,我相信 MVC 使用会话状态来使用 SessionStateTempDataProvider 存储 TempData,因此每个 TempData 将存储在该会话的同一位置。使用 session 我能看到的唯一方法是按照你的建议使用一些标识符。
但是,您可以实现 ITempDataProvider 接口以使用您自己的提供程序,然后该提供程序可以将此数据存储在某种其他形式的存储中(例如 cookie 或 sql)。
【讨论】:
以上是关于每个浏览器选项卡的 MVC 持久模型的主要内容,如果未能解决你的问题,请参考以下文章
需要使用 mvc5 控制器在一个状态时间激活一个选项卡的 jQuery 选项卡限制
如何在 WebView2 中设置基于选项卡的 cookie?
如何使用底部导航菜单处理屏幕旋转,其中每个菜单都引用一个带有有限选项卡的新查看器(3-4)?我正在使用 ViewModel