Asp.net mvc 每个浏览器选项卡的MVC持久化模型

Asp.net mvc 每个浏览器选项卡的MVC持久化模型,asp.net-mvc,model-view-controller,model,tabs,persist,Asp.net Mvc,Model View Controller,Model,Tabs,Persist,我有一个MVC应用程序,但我遇到了现代多功能浏览器的问题 我有一个屏幕,可以创建模型并将其存储在这个.TempData[“MyViewModel”] 然后,我在第二个选项卡中打开相同的屏幕,当它调用相同的控制器方法时,这个.TempData[“MyViewModel”]再次被设置 如果我随后返回到选项卡1并刷新页面,我将看到我在选项卡2中输入的数据 是否有一种方法可以在每个浏览器选项卡的TempData中唯一地存储数据 我曾经尝试过创建一个唯一的TempData键,并使用querystring或

我有一个MVC应用程序,但我遇到了现代多功能浏览器的问题

我有一个屏幕,可以创建模型并将其存储在这个.TempData[“MyViewModel”]

然后,我在第二个选项卡中打开相同的屏幕,当它调用相同的控制器方法时,这个.TempData[“MyViewModel”]再次被设置

如果我随后返回到选项卡1并刷新页面,我将看到我在选项卡2中输入的数据

是否有一种方法可以在每个浏览器选项卡的TempData中唯一地存储数据

我曾经尝试过创建一个唯一的TempData键,并使用querystring或隐藏字段在请求之间持久化它,但这看起来很混乱

欢迎提出任何意见/建议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 Models.MyViewModel
@使用(Ajax.BeginForm(“PartialView1”,“Home”,new{},new AjaxOptions(){UpdateTargetId=“myDivToUpdate”},new{}))
{
@HiddenFor(m=>m.ProcessId);
//其他领域。。。
}
公共行动结果部分视图1(表格收集表格)
{
返回这个.PartialView(“PartialView1”,newmodels.MyViewModel());
}
[HttpPost]
公共行动结果部分视图1(表格收集表格)
{    
Models.MyViewModel vm=新模型.MyViewModel();
this.UpdateModel(vm,form);
this.TempData[vm.ProcessId]=vm;
返回此.PartialView(“PartialView 2”,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);
}
@model Models.MyViewModel
@使用(Ajax.BeginForm(“PartialView2”,“Home”,new{},new AjaxOptions(){UpdateTargetId=“myDivToUpdate”},new{}))
{
@HiddenFor(m=>m.ProcessId);
//其他字段(不同于局部视图1)。。。
}
[HttpPost]
public ActionResult PartialView2(FormCollection表单,Models.MyViewModel虚拟机)
{
vm=(this.TempData[vm.ProcessId]作为Models.MyViewModel);
this.UpdateModel(vm,form);
返回this.Json(新的{result=true,message=“success”},JsonRequestBehavior.AllowGet);
}

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


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

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


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

为什么要在
会话中存储模型!只需将选项卡放置在局部视图中,并通过ajax在单击时重新加载内容?类似于使用jQuery选项卡可以做的事情,这样您就不会感到头痛了。我使用的是TempData,它只在设置它的请求之后为下面的一个请求持久化。我需要在两个控制器请求之间持久化viewmodel,因此这就是TempData的理想用途。问题在于,TempData(如ViewData)是一个具有基于字符串的键的字典,如果硬编码为“MyViewModel”等值,则该键将被浏览器中的另一个选项卡覆盖(如果该选项卡也在查看同一页面)。我需要的是一个每个选项卡都是唯一的TempData store(或类似的东西)。为什么要将模型存储在
会话中!只需将选项卡放置在局部视图中,并通过ajax在单击时重新加载内容?类似于使用jQuery选项卡可以做的事情,这样您就不会感到头痛了。我使用的是TempData,它只在设置它的请求之后为下面的一个请求持久化。我需要在两个控制器请求之间持久化viewmodel,因此这就是TempData的理想用途。问题在于,TempData(如ViewData)是一个具有基于字符串的键的字典,如果硬编码为“MyViewModel”等值,则该键将被浏览器中的另一个选项卡覆盖(如果该选项卡也在查看同一页面)。我需要的是一个tempdatastore(或类似的),每个选项卡都是唯一的。