我注意到window.onunload事件会触发AFTER page_load事件,这是没有意义的。
这种行为给我带来了一个问题 - 在我的unonload中我清除了会话,所以如果Page_Load首先进行onunload,那么页面上就会出现错误。
我希望javascript onunload能够在Page_Load ....之前触发,这是正确的假设吗?
要澄清: 让我们假设我在页面test.aspx上,然后点击进入同一页面的链接(比如我点击菜单),我观察到的是Page_Load首先触发,然后onunload触发。 完全没有意义。
答案 0 :(得分:1)
您是否考虑过为您的网页使用公共基类,并在请求不是回发时清除会话(我假设您正在使用会话进行回发)?
public class BasePage : System.Web.UI.WebControls.Page {
protected override OnPreInit (EventArgs e) {
// Get in nice and early, however you could use OnInit if you prefer
if (!Page.IsPostBack) {
Session.Clear();
}
}
然后,您需要清除会话的页面可以声明为:
public class SpecialPage : BasePage {
// Your page logic goes here.
// Note that if you need to do work in OnPreInit here you should call
// base.OnPreInit(e) first.
}
答案 1 :(得分:1)
这是特定于浏览器的行为。 Chrome和FF将发送GET请求在onunload被触发之前,IE8将首先执行onunload。不确定,其他浏览器如何处理它。最好不要依赖这个功能。
答案 2 :(得分:0)
我会猜测那个window.unload实际上只是在您需要RENDER导航到你导航到的新页面时才会触发(也就是旧的DOM被拆除而不是一些新的HTML)。浏览器不知道要呈现什么,直到响应从服务器返回并显示HTML。在页面生命周期完成之前不会生成HTML,其中包括Page_Load。因此window.unload之前的page_load?
在任何情况下,如果你可以在window.unload期间清除会话,为什么不只是为了响应某些用户交互而清除它并且更明确一些呢?
修改:您还可以尝试使用window.onbeforeunload吗?
答案 3 :(得分:0)
onunload
事件在将新页面的请求发送到服务器之前触发,因此在服务器上运行Page_Load
方法之前肯定会触发。
问题很可能是您从onunload
事件向服务器发送了另一个请求。由于IIS每次只处理一个来自每个用户的请求,因此该请求将在请求新页面后排队并执行。
答案 4 :(得分:0)
您可以编写一个实用程序函数来处理删除会话变量,然后在相应的菜单单击事件中调用该函数。这应该更简单,因为窗口卸载只会在页面加载后触发。
答案 5 :(得分:0)
听起来您正在使用Session来保存在页面之间发生变化的临时变量。我会说会话并不适合这种情况。更好的解决方案是使用Httpcontext的Item集合,该集合的范围仅基于每个请求。它在存储数据时与Session相同。
Context.Items["myvariable"] = "some data";
由于它仅限于每个请求的范围,因此无需使用javascript清除您在每个页面请求中存储的项目。