您的位置:首页 > 移动开发

[asp.net]Application对象与PageRequestManager对象的事件顺序

2009-02-11 09:26 411 查看
转自:http://www.windysky.com.cn/blog/html/389/

个Application对象,指的不是服务端的Application对象,而是由ScriptManager控件生成的客户端脚本中,Sys对象的
Application对象。它的完整名称为Sys.Application。PageRequestManager对象的完整名称为
Sys.WebForms.PageRequestManager。

  Application对象包含init事件和load事件,其
中init事件只有在页面第一次加载以后才会发生,而load事件在客户端获得Ajax请求回发的时候,也会发生。两个事件的的处理,可以通过
Sys.Application.add_init(handler)和Sys.Application.add_load(handler)来添加处理
程序,其中handler是你的事件处理程序。该对象的另外两个事件,disposing和unload,可以通过add_disposing和
add_unload两个函数添加。关于这两个事件的作用,请看后面。

  PageRequestManager对象包含
initializeRequest、beginRequest、pageLoading、pageLoaded、endRequest等事件。
PageRequestManager对象的事件比较特殊,不能直接添加处理程序,而是要先通过调用
Sys.WebForms.PageRequestManager.getInstance()获取该对象的实例,然后才能添加事件处理程序。

 
 假设我有一个变量instance,该变量保存了PageRequestManager对象的实例,然后可以通过以下方法添加事件处理程
序:instance.add_initializeRequest(handler)、
instance.add_beginRequest(handler)、instance.add_pageLoading(handler)、
instance.add_pageLoaded(handler)、instance.add_endRequest(handler)。其中
handler是你的事件处理程序。

  在页面加载的,无论是第一次加载还是Ajax请求,都会发生PageRequestManager对象的所有事件。只是页面第一次加载的时候,PageRequestManager对象都还没生成,所以
面第一次加载的时候,我们唯一能处理的属于该对象的事件是endRequest,该事件也是我们所能处理的第一个事件。然后就是Application对
象的init与load两个事件,他们的顺序如下:PageRequestManager.endRequest、Application.init、
Application.load。
Application的disposing与unload两个事件,是发生在我们离开页面的时候。
我们离开页面时,无论是点击超链接还是用脚本改变location还是刷新页面,就算关闭窗体,都会触发这两个事件。两个事件的发生顺序如
下:Application.unload、Application.disposing。其中,disposing事件是我们能处理的最后一个事件。


  
我们在页面中使用了微软Ajax扩展中的UpdatePanel控件时,当页面部分回发时,会触发PageRequestManager对象的所有事件及
Application对象的load事件,他们的顺序如下:PageRequestManager.initializeRequest、
PageRequestManager.beginRequest、PageRequestManager.pageLoading、
PageRequestManager.pageLoaded、Application.load、
PageRequestManager.endRequest。


  当我们在含有UpdatePanel控件的页面中,进行两次部分页回发的时候,上述两个对象的事件中,只会处理一次。例如,两次回发分别为a和b,事件的顺序如下:

引用
PageRequestManager.initializeRequest //a请求
PageRequestManager.beginRequest //a请求
PageRequestManager.initializeRequest //b请求
PageRequestManager.endRequest //a请求
PageRequestManager.beginRequest //b请求
PageRequestManager.pageLoading //b请求
PageRequestManager.pageLoaded //b请求
Application.load //b请求
PageRequestManager.endRequest //b请求

需要注意的地方是,虽然此时a请求被强制结束了,但服务端还是会处理a请求的,并返回结果的。只是a请求的返回结果,客户端不再处理而已。

 
 在PageRequestManager.endRequest事件中,我们可以处理服务端未处理的Exception。通过参数(这些事件的处理程序
都像服务端事件一样,包含两个参数,一个是sender,一个是args。如:endRequestHandler(sender,
args))args,我们可以调用args.get_error()来获取错误处理对象。通过判断该对象是否为undefined就知道服务端是否发生
错误了。通过调用args.get_error().message可以获取服务端错误信息。手动处理完错误信息后,可以调用
args.set_errorHandled(true)来禁止默认的错误处理程序(默认是把错误通过alert()显示出来)。

  还有一个地方是需要注意的,用UpdatePanel进行Ajax回发的时候,也会触发服务端Page_Load事件,就像普通的页面回发一样,此时Page.IsPostback的值为True。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: