了解ASP.NET网页生命周期事件和Global.asax来解决关闭浏览器触发网页动作

分类:.Net知识问答| 发布:camnprbubuol| 查看: | 发表时间:2011/1/26

怎么在浏览器(多浏览器IE,FF,GG等)关闭网页时,触发一个用户的下线动作执行。下边先看一下Asp.Net的网页事件有哪些?

网页事件

典型的使用方式

PreInit

PreInit事件是网页生命周期中非常早起的一个事件,在PreInit事件触发之后,就会加载用户设置信息与网页主题。我们通常使用PreInit事件来执行下列处理:

l 检查IsPostBack属性,来确认网页是否为第一次被处理。

l 创建或重新创建动态控件。

l 动态设置一个母版页。

l 动态设置Theme属性。

l 读取或设置用户设置文件属性值。

Init

在所有的控件都已经被初始化,而且所有的面板设置都已经应用之后,就会触发Init事件。可以使用此事件来读取或初始化控件属性。

InitComplete

此事件由Page对象触发。当网页初始化完成之后,就会触发此事件。

PreLoad

如果希望在Load事件触发之前,针对您的网页或控件执行一些处理,就可以使用此事件。在Page触发此事件之后,它会加载它本身与所有控件的视图状态,然后处理Request实例的回发数据。

Load

Page会调用Page上的Load事件处理例程,然后按照顺序为每一个子控件执行相同的操作,直到网页与所有控件被加载为止。我们通常会使用Load事件来设置控件的属性并创建数据库连接。

控件事件

我们通常使用控件的各个事件来完成各项互动操作。

LoadComplete

在网页上的所有其他控件都已经被加载之后,要执行的处理就可以通过此事件来完成。

PreRender

在控件已经被加载但是还没有解释之前,就会触发此事件。在此事件之前会执行下列操作:

l Page对象会调用网页与每一个控件的EnsureChildControls方法。

l DataSourceID属性被设置的数据绑定控件会调用其DataBind方法。

网页上的每一个控件都会触发PreRender事件,您可以利用它对网页或其控件的内容做最后的更改。

SavaStateComplete

在已经为网页和网页上的所有控件保存了视图状态与控制状态信息后,就会触发此事件。此时对网页与控件所作的任何更改都会被忽略。

如果您的操作是要在视图状态被保存之后才执行,则非常适合使用SaveStateComplete事件,但是请不要对控件进行任何更改。

Render

Render不是一个事件,而是一个方法。在此阶段,Page对象会调用每一个控件的Render方法。所有的ASP.NET服务器控件都拥有一个Render方法,它会输出要传送给浏览器的控件标记。当我们创建一个自定义控件时,通常会重写Render方法来输出控件的标记。然而,如果您的自定义控件仅仅是标准的ASP.NET服务器控件,而没有任何的自定义标记,则不需要重写Render方法。

Unload

每一个控件的Unload事件被触发之后,才会触发网页的Unload事件。对于控件而言,我们会使用此事件为特定的控件进行最后的清理工作,比方说,关闭某控件所使用的数据库连接。

对于网页本身而言,同样会使用此事件来进行最后的清理工作,比方说,关闭已打开的文件与数据库连接、完成记录写入操作等。

 

怎么应用到我们的项目中,来实现关闭网页触发后台操作呢?

看看JS怎么实现的?

<script type="text/javascript">
        var MSG_UNLOAD = "您确定要关闭本页面吗!";
        var UnloadConfirm = {};
        //启用监听浏览器刷新、关闭的方法
        UnloadConfirm.set = function (confirm_msg) {
            window.onbeforeunload = function (event) {
                event = event || window.event;
                event.returnValue = confirm_msg;

                //Ajax调取后台的一个处理程序,执行想要的操作!
            }
        }
        //关闭监听浏览器刷新、关闭的方法
        UnloadConfirm.clear = function () {
            window.onbeforeunload = function () { };
        }
        UnloadConfirm.set(MSG_UNLOAD);
</script>

以上代码经测试可以在IE和FF下触发动作,但是有以下几个问题

1.刷新页面的时候就触发一次。

2.提交按钮点击了,触发一次。

针对以上的两种情况的触发,在实际项目应用的过程中,是不需要触发的。 我们是只要:点击浏览器的“关闭网页”的那一个动作触发。

那怎么可以实现呢?

 

下边来看一下Global.asax的相关,看是否可以成为一个突破口?

 

Global.asax.cs中的方法的含义

Application_Init:在每一个HttpApplication实例初始化的时候执行

Application_Disposed:在每一个HttpApplication实例被销毁之前执行

Application_Error:所有没有处理的错误都会导致这个方法的执行

Application_Start:在程序初始化的时候执行。在Web应用程序的生命周期里就执行一次,这里只能放一些公用的信息,比如HttpApplicationState。

Application_End:应用程序结束时,在最后一个HttpApplication销毁之后执行。对应Application_Start,在整个生命周期里面也是只执行一次。

Session_Start:会话开始时执行。

Session_End:会话结束或过期时执行。

Application_BeginRequest:BeginRequest是在收到Request时第一个触发的事件,这个方法第一个执行。

Application_AuthenticateRequest:当安全模块已经建立了当前用户的标识后执行。

Application_AuthorizeRequest:当安全模块已经验证了当前用户的授权时执行。

Application_ResolveRequestCache:当ASP.NET完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过处理程序(页面或者是WebService)的执行。这样做可以改善网站的性能,这个事件还可以用来判断正文是不是从Cache中得到的。

Application_AcquireRequestState:当ASP.NET获取当前请求所关联的当前状态(如Session)时执行。

Application_PreRequestHandlerExecute:当ASP.Net即将把请求发送到处理程序对象(页面或者是WebService)之前执行。这个时候,Session就可以用了。

Application_PostRequestHandlerExecute:当处理程序对象工作完成后执行。

Application_ReleaseRequestState:在ASP.NET执行完所有请求处理程序后执行。ReleaseRequestState事件将使当前状态数据被保存。

Application_UpdateRequestCache:在ASP.NET执行完处理程序后为了后续的请求而更新响应缓存时执行。

Application_EndRequest:同上,EndRequest是在响应Request时最后一个触发的事件,这个方法自然就是最后一个执行的了。

Application_PreSendRequestHeaders:向客户端发送Http标头之前执行。

Application_PreSendRequestContent:向客户端发送Http正文之前执行。

Request相应的事件执行顺序:

1.BeginRequest 2.AuthenticateRequest 3.AuthorizeRequest4.ResolveRequestCache 5.AcquireRequestState 6.PreRequestHandlerExecute7.PostRequestHandlerExecute 8.ReleaseRequestState 9.UpdateRequestCache10.EndRequest

 

365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/net-wiki/194.html