0

这是一个 MVC3 网络应用程序。在_Layout.cshtml共享视图中,左侧导航右侧有一个用于加载页面的左侧导航树。在每个树列表项单击时,它将刷新页面以加载具有相同布局视图的相应页面。

在这个 _Layout.cshtml 中,树下面有一个Select Category链接和一个空的 div ( targetDiv)。选择类别链接将打开一个带有 webgrid 的 jQuery UI 模式对话框并显示所有“类别”。单击表中的任何“类别”链接时,对话框将关闭,AJAX 将重新加载 targetDiv,以便 targetDiv 内的 webgrid 填充此“类别”中的所有“书籍”。

如果用户点击任何左侧导航项,整个页面都会重新加载。所以我需要保留所选“类别”的“书籍”列表。为此,当在模式对话框中选择“类别”时,我会保存一个 cookie (CategoryId)。在页面重新加载(文档准备好)时,我在 _Layout 页面中使用了这个 cookie,它再次填充了这个“类别”中的所有“书籍”。

这工作正常,但新要求是允许处理多个“类别”。如果我在浏览器的一个选项卡中选择“类别 1”并按此类别获取所有书籍,在下一个选项卡(同一应用程序的另一个实例)中,我应该能够处理不同的“类别”和不同的集合图书。在这种情况下,我不能使用 cookie,因为 cookie 在所有选项卡中共享。

如何在不同的实例(浏览器选项卡/窗口)上设置不同的“类别”?

4

2 回答 2

1

如果我正确理解您的问题,最简单的方法是使用 AJAX 回发来填充您的targetDiv字段,而不是每次都重新加载页面。然后您将只加载页面的相关部分,以便您可以一次打开任意数量的选项卡,而不会相互干扰。

MVC3 为 AJAX 请求提供了很多支持——只需将绘制网格的东西放在局部视图中,当用户选择不同的选项时,很容易改变它。

为了帮助维护跨 AJAX 请求的状态,您可以将其存储在表单字段中,并在您提出请求时将值传入 - 有几种不同的方法可以做到这一点,或者使用 AjaxForm 并将其与请求一起提交,或者添加JQuery 请求的参数取决于您选择实现表单的方式。您可以将当前 CategoryId 存储为隐藏字段,然后在创建请求时将其添加到请求中。如果您在单个页面上打开了多个类别,则可以使用具有相同名称的隐藏字段列表来表现得像一个复选框组,或者在您的隐藏字段中编码一个列表应该可以解决问题。

于 2012-07-17T13:28:06.807 回答
0

我已经解决了这个问题。我在 JavaScript 中使用了无 Cookie 会话变量。它基本上将您的数据存储在window.name重新加载页面时不会被清除的属性中。每个选项卡都有不同的window对象(这就是我想要的),并且在所有主要浏览器中都受支持。

这就像会话 cookie,唯一的区别是这些数据不会像普通会话 cookie 那样在窗口/选项卡之间存在。

另请参阅没有 cookie 的会话变量

于 2012-07-19T10:39:26.863 回答