代码改变世界

[翻译]使用PageRequestManager事件

2007-06-18 14:34  Valens  阅读(2154)  评论(3编辑  收藏  举报


翻译:Valens
时间:2007-06-18
原文:http://ajax.asp.net/docs/tutorials/UpdatePanelClientScripting.aspx

欢迎大家提出意见,我会积极进行修改的!

Introduction【介绍】

在一个能部分刷新ASP.NET页面中,与微软AJAX库中的 PageRequestManager 类相配套的服务器端控件有 ScriptManager 和 UpdatePanel。PageRequestManager 类暴露出的方法,属性和事件都能够帮助我们在客户端编写表达页面元素异步刷新效果的编程工作变得简单。比如说,PageRequestManager 类使得你能够操作客户端页面生命周期事件和能够提供定制特别的部分刷新的事件操作。

要使用 PageRequsetManager 类的客户端事件,就需要在页面中添加一个 ScriptManager 控件。并且该控件的 EnablePartialRendering 属性必须设为 true(在默认情况下是 true)。当 EnablePartialRendering 被设为 true 时,那么包含了 PageRequestManager 类的客户端脚本库就能够使用了。

Getting an Instance of the PageRequestManager Class【获得 PageRequestManager 类的一个实例】

在每一个页面中都有一个 PageRequestManager 实例。你不需要创建这个实例。你只需要通过调用 getInstance 方法来获得一个引用,就像下面这个例子一样:

Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(InitializeRequest);

当你拥有了当前 PageRequestManager 实例后,就可以访问它的所有方法,属性和事件了。举例来说,你可以获得 isInAsyncPostBack 属性来确定在进程中是否有一个异步回送,如下面这个例子:

function InitializeRequest(sender, args)
{
    var prm 
= Sys.WebForms.PageRequestManager.getInstance();
    
if (prm.get_isInAsyncPostBack() & args.get_postBackElement().id == 'CancelPostBack'{
        prm.abortPostBack();
    }
    
}

如果 ScriptManager 控件的 EnablePartialRendering 属性值是 false 时,就不能够访问 isInAsyncPostBack 属性了,原因就是当前不存在 PageRequestManager 实例。

Client Page Life-cycle Events【客户端页面的生命周期事件】

浏览器在处理普通页面时,一般都是在页面第一次加载的时候引发 DOM 的 window.onload 事件。类似的,DOM 的 window.onunload 事件在页面被刷新或用户离开本页时被引发。

可是,这些事件在异步回送过程中是不会被引发的。为了帮助管理在异步回送时类似的事件,PageRequestManager 类就暴露了一系列的事件。这些类似 window.load 和其它的 DOM 事件在异步回送时是不会被触发的。对于每个异步回送,所有在 PageRequestManager 类中提供的页面事件会被引发和可调用的附加事件操作。

注意
异步回送是不会引发 pageLoaded事件的。

你可以利用 PageRequestManager 类写一些客户端脚本到操作事件(注:实现一些功能的函数?)。不同的事件参数对象被传递给了不同的事件。下面这个列表罗列出了 PageRequestManager 类的事件并且这些事件都需要相应的参数。在一次没有发生任何错误的异步回送的情况下,事件发生顺序如列表所列。

initializeRequest 【初始化请求】
在一个异步回送的请求初始化前被引发。事件的数据以一个 InitializeRequestEventArgs 对象传递给了操作。这个对象使得那些引起回送的请求对象变得可用。

beginRequest 【开始请求】
在异步回送被发送到服务器之前引发。事件的数据以一个 BeginRequestEventArgs 对象传递给了操作。这个对象使得引起回送和请求的对象元素变得可用。

pageLoading 【页面正在加载】
在响应了最近的异步回送后,在任何页面被更新之前引发。事件的数据以一个 PageLoadingEventArgs 对象传递给了操作。该对象使得关于在一个异步回送返回的结果中哪些 panels 需要被删除和创建的这些信息可用。

pageLoaded 【页面已加载】
在最近的回送后,页面某写区域已经被更新后被引发。事件的数据以一个 PageLoadedEventArgs 对象传递给了操作。该对象使得关于哪些 panels 需要被创建或更新的信息可用。在同时(传统)回送时,panels 仅能被创建,而在异步回送时,panels 就不仅可以被创建也可以被更新。

endRequest 【结束请求】
在请求执行结束时引发。事件的数据以一个  EndRequestEventArgs 对象传递给了操作。该对象使得关于发生的错误和错误是否被处理的相关信息可用。它还使得响应对象可用。

如果你使用了 ScriptManager 控件的 RegisterDataItem 方法在一次异步回送时传送额外的数据,你能够访问到 PageLoadingEventArgs, PageLoadedEventArgs, 和 EndRequestEventArgs 对象中的数据。

在不同情景下事件发生的顺序是随之变化的。上表中列出的是一个单一的,成功执行异步回送顺序。下面列出了其它情况下的:

           · 在多个异步回送中,默认行为是最近的那个获得优先。最近的异步回送事件被引发。
           · 在多个异步回送中,如果某个回送获得较高优先,则会取消后来的异步请求,直至该请求完成。仅在初始化请求事件时可以撤销回送。
           ·  一个异步回送被中止。要视乎在什么时候被中止,有些事件是不会被引发的。
           ·  一个页面的初始请求(HTTP GET)或页面被刷新的初始请求。当一个页面首次加载或它被浏览器刷新时,只有 pageLoaded 事件被引发。

Stopping and Canceling Asynchronous Postbacks【停止和取消异步回送】

有两个普通的任务来停止一个正在进行中的异步回送和取消一个新的将开始的请求。想要实现这些任务,只需按照下面的做:

          ·  为停止一个存在的异步回送,通过调用 PageRequestManager 类的 abortPostBack 方法即可。
          ·  为取消一个新的异步回送,你需要操作 PageRequestManager 类的  initializeRequest 事件并设置 cancel 属性的值为 true 即可。
 
Stopping an Asynchronous PostBack【停止一个异步回送】

下面这个例子展示了如何停止一个异步回送。initializeRequest 事件操作一些脚本来检查用户是否选择了停止回送。如果选择停止,则代码调用 abortPostback 方法。

想获得更多的信息,请参考 Canceling an Asynchronous Postback.

Canceling New Asynchronous Postbacks【取消一个新的异步回送】

下面这个例子展示了如何为某特定的异步回送设置优先。这会取消所有后来的异步回送,直至到当前回送完成。(默认的,最近的异步回送将获得优先。)在 initializeRequest 事件操作检查是否有页面中的某元素发起优先的异步回送。如果有,则通过设置 InitializeRequestEventArgs 对象的 cancel 属性来取消。InitializeRequestEventArgs 事件继承自 CancelEventArgs 类,cancel 属性是由该类所定义的。

想获得更多的信息,请参考 Giving Precedence to a Specific Asynchronous Postback.

Displaying a Custom Error Message【显示一个自定义的错误信息】

下面这个例子展示了如何在一个异步回送发生错误时,显示一个自定义的错误信息。使用的 ScriptManager 控件的 AsyncPostBackError 事件在服务器端处理代码,并且将错误信息发送到浏览器并显示出来。

想获得更多的信息,请参考 Customizing Error Handling for UpdatePanel Controls.

Animating Panels【友好提示】

下面这个例子展示了如何以一种有趣的表现形式在一个 UpdatePanel 控件来提示用户内容被修改了。当你点击 LinkButton 控件时(注意是点击页面上部分那行话中的日期),UpdatePanel 控件边框将短暂的闪烁。

想获得更多的信息,请参考 Animating UpdatePanel Controls.