2

有谁知道如何检测OnBeforeUnload服务器端代码发送的事件Response.Redirect?我想提示用户不要让他们在时间之前离开页面,但是当服务器重定向我时,它不应该提示用户。

我正在使用广泛使用的遗留代码,Response.Redirect我对改变重定向发生的方式不感兴趣。请不要建议我使用 X 重定向方法。

应该可以根据 XMLHttpRequest 对象中的响应代码来执行此操作,因为响应重定向应该发回 302 。

编辑: Response.Redirect 发回 200,在正文中带有重定向代码,然后window.location.href = new page在 ASP.Net 代码中执行。有没有办法获得服务器响应以确定这已经发生?

4

3 回答 3

6

我想出了一个解决方案。

当 PageRequestManager 正在处理来自服务器的响应时,它将设置 _processingRequest 标志。为了允许 response.redirect 通过,我更改了我的 javascript 来检查它。事件现在看起来像这样:

window.onbeforeunload = function() {
  var prm = Sys.WebForms.PageRequestManager.getInstance();
  if (!prm._processingRequest){ 
    return "Are you sure you want to leave?";
  }
};
于 2009-04-03T21:53:27.407 回答
0

对于非 ajax 页面,你很不走运,因为页面永远不会发送到浏览器,只是 302 标头。所以没有机会进行 OnBeforeUnload 的 javascript 处理。

使用 ASP.NET AJAX 的 Response.Redirect 并没有真正执行 302。它通过 XMLHttpRequest 发回一条消息,而 ASP.NET AJAX 正在模拟 302。理论上你可以拦截它并执行你自己的处理......

于 2009-04-03T21:15:31.897 回答
0

是的,Response.Redirect有一个重载让您决定是否终止请求(引发 a ThreadAbortException)。如果让Responsefinish(第二个参数传递false);OnBeforeUnload也会运行。

但是,在这种情况下,简单地运行OnBeforeUnload对您没有帮助,因为您的客户端代码(提示)将在新页面发送到浏览器之前运行(并且,如果您重定向,它也只是 302 标头而不是真实页面)。

我会使用 AJAX 来查询服务器,如果它报告操作已完成,则允许在 Javascript 代码中进行重定向。

于 2009-04-03T21:19:31.670 回答