代码的魅力

BI, .NET

导航

ASP.NET AJAX客户端生命周期分析(实践篇)(2)

Posted on 2009-03-01 19:42  moge  阅读(203)  评论(0编辑  收藏  举报

三、典型场所下事件发生顺序解析

实际环境下,事件的触发顺序依赖于页面中使用了什么控件以及发生了什么类型的请求(初始化请求,传统回送或是异步回送)。下面,我们来归纳一下几种常见场所下事件的引发顺序。

(一)初始请求阶段引发的事件顺序

在页面的初始请求阶段,仅引发有限的几个客户端事件。假设下面就是初始化请求的情景:

◆Web页面中包含一个ScriptManager控件,且该控件的SupportsPartialRendering和EnablePartialRendering属性都置为true。
◆请求为GET类型;
◆服务器能正常响应。

在这种情况下,将依次发生以下客户端事件:

1、初始化请求发生给服务器;
2、客户端接收到响应;
3、Application实例引发init事件;
4、Application实例引发load事件。

请注意,init事件仅在整个页面生命周期过程中的Application实例化时发生一次,它不会再被后来的异步回送所引发。在初始化请求(注意是请求)期间,再没有任何的PageRequestManager事件引发。

(二)异步回送阶段引发的事件顺序

在一次异步回送中,将有一些页面数据被发送到服务器,接收一个服务器端的响应,然后更新页面的相应部分。我们不妨假定存在如下的一个异步回送的场所:

◆页面中包括一个ScriptManager控件,并且该控件的SupportsPartialRendering和EnablePartialRendering属性都为true;
◆页面中存在一个UpdatePanel控件,并且此控件的ChildrenAsTriggers属性值为true;
◆在UpdatePanel控件内部存在一个用于引发异步回送的按钮;
◆成功地从服务器端获得响应。

那么,上面情况将对应下面的客户端事件发生顺序:

1、点击UpdatePanel控件中的按钮时,引起了一个异步回送;
2、PageRequestManager实例引发initializeRequest事件;
3、PageRequestManager实例引发beginRequest事件;
4、请求被发送到服务器;
5、客户端接收到响应;
6、PageRequestManager实例引发pageLoading事件;
7、PageRequestManager实例引发pageLoaded事件;
8、Application实例引发load事件;
9、PageRequestManager实例引发endRequest事件。

请注意Application的load事件发生在PageRequestManager的pageLoaded事件之后且在endRequest事件之前。

(三)存在多个异步回送时事件引发的顺序问题

当之前的一个请求正在服务器端或浏览器中运行时,用户又发送了一个新的请求时,则发生了多个异步回送。假设下面的场景描述了多个异步回送的情况。

◆页面包括一个ScriptManager控件,并且该控件的SupportsPartialRendering和EnablePartialRendering属性都为true。
◆页面包含一个UpdatePanel控件。
◆在UpdatePanel中有一个引发异步回送的按钮控件被点击两次。第二次的点击发生在服务器端正在处理第一次点击发起的请求。
◆获得了从服务器端返回的对第一次请求的响应。

下面是客户端事件发生的顺序:

1、点击UpdatePanel中的按钮将引发一次异步回送。
2、PageRequestManager实例将引发initializeRequest事件。
3、PageRequestManager实例引发beginRequest事件。
4、请求被发送到服务器。
5、再次点击按钮,引发第二次异步回送。
6、PageRequestManager实例针对第二次按钮点击引发initializeRequest事件。
7、PageRequestManager实例针对第一次按钮引发endRequest事件。
8、PageRequestManager实例针对第二次按钮点击引发beginRequest事件。
9、因第二次点击引发的请求被发送到服务器端。
10、接收到针对第二次点击的响应。
11、PageRequestManager实例引发loading事件。
12、PageRequestManager实例引发pageLoaded事件。
13、Application实例引发load事件。
14、PageRequestManager实例引发endRequest事件。

【注意】默认情况下,异步回送行为一般是最近发生的那次异步回送优先级较高。如果两个异步回送按顺序发生,并且第一个异步回送仍在浏览器处理中,则第一个回送将被取消。如果第一个回送已被发送到了服务器端,则服务器在第二个请求到来并处理它之前是不会返回第一个请求的。

(四)当用户浏览焦点脱离开本页面时引发事件的情况

当用户从本页面转向访问其它页面时,当前的页面会从浏览器中卸载;因此,这时你可以通过控件unload事件来释放有关资源。我们不妨假定当用户转向访问其它页面时存在如下情况:

◆页面中包括一个ScriptManager控件,并且该控件的SupportsPartialRendering和EnablePartialRendering属性都为true。
◆存在将转向的目标页面。

于是,下面对应发生在客户端的事件顺序:

1、初始化一个对新页面的请求;
2、浏览器获得请求新页面的响应;
3、Application实例引发unload事件;
4、显示新页面。

如果在新页面请求时发生了错误,依然会引发unload事件;只是不显示新页面罢了。

四、总结

本文中,我们使用一个具体的例子针对ASP.NETAJAX客户端生命周期中涉及的主要事件引发的顺序给出了追踪分析。但此示例显然有其特殊性且仍嫌粗略,实际开发中宜结合具体问题作针对性分析,以图从根本上掌握ASP.NETAJAX客户端生命周期中引发的主要事件先后顺序及其间的逻辑关系。