我有一个 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);
}