像cookie这样的全局变量,它在回发后保留值,但应该为不同的实例保存不同的值(选项卡/窗口)
A global variable like cookie which retains value after postback, but it should save different value for different instances (tab/window)
这是一个MVC3 web应用程序。在_Layout.cshtml
共享视图中,有一个左导航树,用于在左导航的右侧加载页面。每次单击树列表项时,都会刷新页面以加载具有相同布局视图的相应页面。
在这个_Layout.cshtml中,树下面有一个Select Category
链接和一个空div(targetDiv
)。选择类别链接将打开一个带有网络网格的jQuery UI模式对话框,并显示所有"类别"。单击表中的任何"类别"链接后,对话框将关闭,targetDiv将通过AJAX重新加载,这样targetDiv内的网络网格将填充此"类别"中的所有"书籍"。
如果用户点击任何左侧导航项目,整个页面都会重新加载。因此,我需要保留所选"类别"的"图书"列表。为此,当在模式对话框中选择"类别"时,我会保存一个cookie(CategoryId)。在页面重新加载(文档就绪)时,我在布局页面中使用此cookie,该页面再次填充此"类别"中的所有"书籍"。
这很好,但新的要求是允许处理多个"类别"。如果我在浏览器的一个选项卡中选择"类别1",并在下一个选项卡(同一应用程序的另一个实例)中按此类别获取所有书籍,我应该能够处理不同的"类别",因此可以收集不同的书籍。在这种情况下,我不能使用cookie,因为cookie是在所有选项卡上共享的。
如何在不同的实例(浏览器选项卡/窗口)上设置不同的"类别"?
如果我正确理解您的问题,最简单的方法是使用AJAX回发来填充targetDiv
字段,而不是每次都重新加载页面。然后,您将只加载页面的相关部分,这样您就可以一次打开任意多个选项卡,而不会相互干扰。
MVC3为AJAX请求提供了很多支持——只需将绘制网格的内容放在部分视图中,当用户选择不同的选项时,就可以很容易地对其进行更改。
为了帮助维护AJAX请求的状态,您只需将其存储在表单字段中,并在提出请求时传递值-有几种不同的方法可以做到这一点,要么使用AjaxForm并将其与请求一起提交,要么根据您选择如何实现表单,使用JQuery将参数添加到请求中。您可以将当前CategoryId存储为隐藏字段,并在创建请求时将其添加到请求中。如果在一个页面上打开了多个类别,则可以使用具有相同名称的隐藏字段列表来表现为复选框组,也可以在隐藏字段中对列表进行编码。
我已经解决了这个问题。我在JavaScript中使用了无Cookie会话变量。它基本上将数据存储在window.name
属性中,当您重新加载页面时,该属性不会被清除。每个选项卡都有一个不同的window
对象(这就是我想要的),并且在所有主流浏览器中都支持。
这就像会话cookie一样,唯一的区别是这些数据无法像正常会话cookie那样在窗口/选项卡之间存活。
另请参阅不带cookie的会话变量。
- ES6构造函数返回基类的实例
- 如何将对象保存到谷歌UI实例中
- 像cookie这样的全局变量,它在回发后保留值,但应该为不同的实例保存不同的值(选项卡/窗口)
- Thinky.io 有很多没有保存新的模型实例
- 获取保存函数实例的变量的名称,在此函数中
- 猫鼬数据不会保存模型的新实例
- 仅保存当前实例的对象值
- 角度资源 - 如何检查资源实例是否有任何未保存的更改
- 在保存新的模型实例之后,在Ember.js中转换到路由之前,更新资源模型
- 在带有模态窗口实例的 Angular JS 中保存和下一步
- node-orm2实例缺少保存方法
- 分析XML并将标记实例保存在变量中
- 如何将保存的画布图形图像恢复到新的画布实例中
- 如何保存对象实例(和选项)以便将来应用方法
- 通过NodeJS将对象保存到DynamoDB实例
- 使用原型模式在javascript类中保存实例值
- 云代码-在保存之前创建另一个对象的新实例
- 如何在不保存的情况下创建水线模型的新实例
- 保存混合应用的实例状态
- 基于Sinon的猫鼬模型存根保存实例方法