每个浏览器选项卡的MVC持久模型

时间:2012-05-21 14:22:09

标签: asp.net-mvc model-view-controller model tabs persist

我有一个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检索我的viewmodel并更新它:

部分视图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);
}

1 个答案:

答案 0 :(得分:0)

默认情况下,我相信MVC使用会话状态来使用SessionStateTempDataProvider存储TempData,因此每个TempData将存储在该会话的相同位置。使用会话,我可以看到的唯一的就是使用你建议的一些标识符。

但是,您可以实现ITempDataProvider接口以使用您自己的提供程序,然后可以将此数据存储在某种其他形式的存储中(例如cookie或sql)。