Pin*_*ave 9 asp.net asp.net-mvc
每当用户在ASP.NET MVC应用程序中打开新的浏览器选项卡或窗口时,我想创建唯一的会话.是否可以在ASP.NET/MVC中使用?
我试着按照下面的解决方案
asp.net - 会话 - 多个浏览器标签 - 不同的会话?
但它在ASP.NET MVC中不起作用.上面的解决方案使用ViewState,在MVC中我尝试使用TempData但它不起作用.
小智 6
多年后我终于找到了解决这个问题的方法:
1.)浏览器必须自己提供ID,因为http是无状态的,cookie不是单独存储在浏览器选项卡中,因此asp.net会话也不区分单个选项卡.
2.)打开新选项卡时,JS window.name为''.将window.name更改为某个值后,只要该选项卡处于活动状态并且某些代码未更改它,它就不会再更改.
所以解决方案是:在*.master或每个*.aspx文件中实现一些简短的JS代码:
if (typeof window.name != undefined) {
if (window.name == '') {
var d = new Date();
window.name = '_myWnd_' + d.getUTCHours() + d.getUTCMinutes() + d.getUTCSeconds() + d.getUTCMilliseconds();
}
var eDiv = document.getElementById('div_BrowserWindowName');
var e = eDiv.getElementsByTagName('input')[0];
e.value = window.name;
}
Run Code Online (Sandbox Code Playgroud)
还要添加*.master或每个*.aspx文件的表单部分:
<div id="div_BrowserWindowName" style="visibility:hidden;">
<asp:HiddenField ID="hf_BrowserWindowName" runat="server" />
</div>
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过在每次回发后读取隐藏字段来检索window.name == UNIQUE ID,即使用户从一个站点跳到另一个站点并在几小时后返回到表单也是如此.
如您所知,HTTP 是无状态的,在请求之间保持状态的一种非常常见的机制是使用会话变量。当您打开新的浏览器选项卡时会出现问题,因为会话是相同的,因此您在新选项卡中所做的任何更改都会影响其他选项卡。您没有准确指定要执行的操作,但假设您有一个产品列表页面,用户可以在其中输入搜索过滤器,并且您希望将它们保存在会话中。如果用户在选项卡 1 中设置搜索过滤器值,则选项卡 2 将具有相同的值(它们共享会话变量)。你可以做什么?
1)使用此方法在 URL 中添加 guid:http://www.codeproject.com/Articles/331609/Get-an-unique-session-in-each-browser-tab
2)做一些与上一点中描述的类似的事情,但不是以相同的方式,这就是我为解决同样的问题所做的事情。
a) 我的搜索页面链接是 /Product/List?guid=xxx 而不仅仅是 /Product/List。如果用户手动键入 /Product/List,我会将他重定向到设置了 GUID 的新 URL。
public ActionResult List(string guid)
{
if (guid == null)
{
return RedirectToAction("List", new { guid = Guid.NewGuid().ToString() });
}
...
Run Code Online (Sandbox Code Playgroud)
每次单击“列表”链接并定位新选项卡时,都会生成一个新的 GUID。
b) 我有一个带有 GUID 的会话密钥,因此每个页面都有自己的值。您可以同时打开 2 个选项卡,它们将使用不同的会话值,因为 guid 会有所不同。
这个解决方案并不完美,但至少有效。
我希望它有帮助。
归档时间: |
|
查看次数: |
21609 次 |
最近记录: |