像cookie这样的全局变量,它在回发后保留值,但应该为不同的实例保存不同的值(选项卡/窗口)

A global variable like cookie which retains value after postback, but it should save different value for different instances (tab/window)

本文关键字:保存 实例 cookie 选项 窗口 保留 全局变量      更新时间:2023-11-17

这是一个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的会话变量。