捕获页面卸载以执行后面的代码

时间:2014-06-11 09:51:55

标签: asp.net vb.net

我试图抓住用户离开页面(母版页内的内容页面),这样我就可以更新数据库中的标志(数据库对客户端PC不可见,所以我无法编码链接到客户端)。

目前我可以通过jQuery触发__doPostBack()事件来抓取页面卸载,然后我抓住服务器端。

然而,这会阻止重定向从触发,除非我将其编码为回发代码的一部分。由于有两个触发此回发事件的按钮需要不同的行为,因此会导致问题。

我已经尝试设置一个viewstate来确定pageunload是否是由两个按钮之一引起的,并且单步执行代码我可以看到按钮代码正确触发并将viewstate更新为正确的值,但是当这时触发PageUnload代码后,viewstate将恢复为之前的值。

我尝试过隐藏字段,但在卸载页面之前不会重建页面,因此隐藏字段仍保留以前的值。

我已经尝试了一个页面变量但是该值仍然没有。

有没有办法告诉后面的代码继续重定向,或者设置一个标志来帮助我触发正确的重定向?

当前代码: (在内容页面上)

$(document).ready(function(){
$(window).unload(function(){
__doPostBack('Unload','');
});
});

(在页面上,代码隐藏)

Dim eventtarget as String
Me.ClientScript.GetPostBackEventReference(Me, String.Empty)
If (Me.Request("__EVENTTARGET") is nothing) then
eventtarget = string.empty
else
eventtarget = Me.Request("__EVENTTARGET")
End If

If eventtarget = "Unload" then
closepage()
End If

closepage()只会触发我需要执行的代码(记录页面已在数据库中关闭)。

感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用HTTP处理程序来完成这项工作,如果许多不同的页面具有相同的要求,这将非常有用。

$(document).ready(function(){
$(window).unload(function(){
            var xmlhttp;
            if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp = new XMLHttpRequest();
            }
            else {// code for IE6, IE5
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("GET", "http://yourPageClosedHandler.ashx?pageID=yourpageid", false);
            xmlhttp.send();
});
});

然后是一个带有这种代码的http处理程序..

<%@ WebHandler Language="VB" Class="pageClosedHandler" %>

Imports System
Imports System.Web

    Public Class pageClosedHandler : Implements IHttpHandler

        Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
            If Not IsNothing(context.Request.QueryString("pageID")) Then
                Dim pageID As String = context.Request.QueryString("pageID")
                ' do your stuff here
            End If
        End Sub

        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property

    End Class

虽然没有更多的工作,但它很容易被利用,所以我不推荐它用于你需要知道你的应用程序调用了处理程序的场景。

答案 1 :(得分:0)

从另一个关于jQuery的问题得到了提示,似乎可以解决这个问题。

var leaving = true;

$(function(){
 $('a[rel=ext]').click(function(){leaving=false});
 $('form').submit(function() {leaving=false});
});

$(document).ready(function(){
 $(window).unload(function(){
  if(leaving){
   __doPostBack('Unload','');
  };
 });
});

这解决了打开新窗口(response.write)时doPostBack触发的一个问题。

第二个问题是使用Response.Redirect - 只是将',true'添加到结尾以停止进一步的代码执行(这很好 - 执行所需的所有内容已经在那时执行。

只需进行测试,测试和测试,然后传递给测试人员,看看我是否遗漏了任何东西。