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

3 篇文章 0 订阅
2 篇文章 0 订阅

转自: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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值