在使用window.open打开窗口关闭后丢失会话状态

时间:2009-03-24 19:45:42

标签: asp.net session session-state

目前我们正在使用window.open打开一个新的aspx页面。 window.open位于当前aspx页面的javascript函数(openNewWindow())中,当单击asp.net超链接控件时调用该函数。

我们的框架会在页面上动态创建链接,因此我希望避免更改该功能。

问题似乎是当这个新的“子”窗口关闭时,会话状态就会丢失。我应该提一下,在“子”窗口关闭后,子窗口中的会话不在“父”窗口中。

有趣的是,似乎在我们的应用程序的其他地方,如果通过在超链接控件的代码隐藏点击事件上使用ClientScriptManager.RegisterStartupScript调用将open.window调用添加到页面(而不是它调用的函数是在aspx中编码的会话被保留。

后一种解决方案很难在当前的框架代码中实现,而不需要进行重大更改以及所需的所有回归测试。

任何人都知道如何在子窗口关闭后保持会话状态。

BTW这是在IE7中发生的,我们的应用程序是基于asp.net 2.0的。

提前感谢您对此问题的深刻而优雅的解决方案! ; O)

3 个答案:

答案 0 :(得分:1)

IE 7改变了新窗口的行为。基本上,每个窗口都是在它自己的进程中打开的。选项卡仍在同一进程中打开。

这意味着每个新窗口都有自己的cookie包。这意味着新窗口没有自动分配Sesssion_ID cookie。 .Net链接控件将cookie发送到新窗口。但是,只使用直接javascript打开一个新窗口可能不会那样做。

FireFox已经有一段时间了,我相信Chrome一直都是这样。 IE 6和之前的共享进程空间,即使对于多个窗口也是如此,因此两者之间共享所有内容,这严重导致IE中的调试站点无法解决问题。

<强>更新
Here's a link详细描述了问题。您会注意到这种行为有些不一致。原因是有时IE 7决定在自己的进程中打开新窗口,有时它会在新窗口中打开它。

有两种真正的解决方案。要么完全停止依赖会话(我的第一选择,我有很强的技术原因),或者你需要切换到无cookie会话。

答案 1 :(得分:0)

我应该纠正自己(抱歉无法编辑原始问题)并说控制触发javascript来做'window.open'是链接按钮而不是超链接。

答案 2 :(得分:0)

这也发生在我的Chrome中。

我通过添加以下内容解决了这个问题:

<link rel="shortcut icon" href="../../img/favicon.ico">
在即将打开的页面<head></head>