Response.Redirect和OnBeforeUnload可以一起玩吗?

时间:2009-04-03 21:01:21

标签: asp.net javascript ajax asp.net-ajax javascript-events

有没有人知道如何在OnBeforeUnload事件中检测到服务器端代码发送了Response.Redirect?我想提示用户阻止他们在某个时间之前离开页面,但是当服务器重定向时我不应该提示用户。

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

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

编辑:Response.Redirect发回200,主体中有一个重定向代码,然后在ASP.Net代码中执行window.location.href =新页面。有没有办法获得服务器响应以确定是否发生了这种情况?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分: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?";
  }
};

答案 1 :(得分:0)

对于非ajax页面,你运气不好,因为页面从未发送到浏览器,只有302标题。因此,没有机会对OnBeforeUnload进行javascript处理。

使用ASP.NET AJAX,Response.Redirect实际上不会执行302.它通过XMLHttpRequest发回消息,ASP.NET AJAX正在模拟302.理论上,您可以截取此消息并执行自己的处理。 ..

答案 2 :(得分:0)

是的,Response.Redirect有一个重载,可让您决定是否终止请求(提出ThreadAbortException)。如果你让Response完成(传递假为第二个参数); OnBeforeUnload也将运行。

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

我会使用AJAX查询服务器,如果它报告要完成的操作,请允许重定向Javascript代码。