拥抱变化——从Atlas到ASP.NET AJAX(3):“仁慈”的UpdatePanel
在ASP.NET AJAX中,相对于ScriptManager翻天覆地的变化,UpdatePanel的变化要“友善”得多,也较为易于理解。UpdatePanel将仍作为最重要ASP.NET AJAX服务器端控件存在于ASP.NET AJAX核心组件(Microsoft ASP.NET AJAX v1.0 Beta)中,用于让页面中的某个局部内容拥有异步更新的功能。
本文将分析相对于Atlas,ASP.NET AJAX中UpdatePanel控件使用方法的变化。
ScriptManager的设定
和Atlas一样,ScriptManager的EnablePartialRendering属性也要设置为true,但这已经是ASP.NET AJAX中的默认设置,我们一般无须再手工干预。另外,ASP.NET AJAX中的ScriptManager还暴露出了AsyncPostBackErrorMessage属性、AsyncPostBackTimeout属性和AsyncPostBackError事件,可以用于对UpdatePanel在进行异步更新时引发的异常进行处理。这部分内容详见拥抱变化——从Atlas到ASP.NET AJAX(2):变化得翻天覆地的ScriptManager(Dflying仍有好多疑问,请指教)。
让我们从声明UpdatePanel的标签开始逐一说明其变化:
<asp:UpdatePanel>标签
同样,原有的“altas”前缀被改为了“asp”。下面是UpdatePanel支持的几个属性:
- RenderMode:与原有的Atlas ScriptManager完全相同,表示UpdatePanel最终呈现的HTML元素。Block(默认)表示<div>,Inline表示<span>,按布局需求选择即可。
- UpdateMode:与原有的Atlas ScriptManager基本相同,表示UpdatePanel的更新模式。可选Always或Conditional。Always(默认)表示无论任何类型(异步回送或整页回送),任何控件引发的回送均将更新该UpdatePanel。Conditional表示只有当前UpdatePanel的Trigger,或ChildrenAsTriggers属性为true时当前UpdatePanel中控件引发的异步回送,以及整页回送,或是服务器端调用Update()方法才会引发更新该UpdatePanel。
- ChildrenAsTriggers:布尔值(默认为true)新属性,表示当UpdateMode属性为Conditional时,该UpdatePanel中包含的控件所引发的异步回送是否会触发本UpdatePanel的更新。需要注意的是,当UpdateMode为Always时,ChildrenAsTriggers不能设置为false,否则页面将抛出异常。
接下来让我们看看<asp:UpdatePanel>标签中的各种子标签的变化:
<Triggers>标签
<Triggers>中同样将设置该UpdatePanel的触发器集合。在Atlas的UpdatePanel中,支持ControlValueTrigger和ControlEventTrigger两种触发器,ASP.NET AJAX的UpdatePanel则将二者统一为AsyncPostBackTrigger,另外还添加了另外一种触发器——PostBackTrigger。详细说明如下:
<asp:AsyncPostBackTrigger>标签
AsyncPostBackTrigger用来指定某个服务器端控件以及其将触发的服务器端事件作为该UpdatePanel的异步更新触发器,类似于Atlas中的ControlEventTrigger。AsyncPostBackTrigger支持如下两个属性:
- ControlID:服务器端控件的ID。
- EventName:服务器端控件的某个服务器端事件。
<asp:PostBackTrigger>标签
在Atlas的UpdatePanel中,其包围的控件所引发的回送均将被强制使用异步回送模型。ASP.NET AJAX中PostBackTrigger的出现则弥补了这个缺陷,给开发者更大的灵活性。PostBackTrigger可以指向本UpdatePanel中包含的某个服务器端控件,这样由该控件引发的回送将仍使用传统的整页回送模型。PostBackTrigger支持如下属性:
- ControlID:<ContentTemplate>中某个将引发整页回送的服务器端控件的ID。
<ContentTemplate>标签
与Atlas的UpdatePanel中的<ContentTemplate>完全相同,用来放置需要进行异步更新的局部页面内容。
异步回送和整页回送
所谓“整页回送”,是指传统的HTTP POST过程,页面内容将在回送之后完全刷新。所谓“异步回送”,即回送将通过XmlHTTPRequest对象异步进行,页面内容将仍能够得以保留。
默认情况下,ASP.NET中所有的回送均为整页回送。但使用了UpdatePanel之后,处于如下情况的控件的回送将改为异步进行:
- 在UpdatePanel之外,被<asp:AsyncPostBackTrigger>引用,作为某个UpdatePanel进行异步更新的触发器的控件。
- 在UpdatePanel中,未被该UpdatePanel的<asp:PostBackTrigger>引用的服务器端控件。
相对于Atlas,ASP.NET AJAX中的异步回送还增加了若干个客户端的事件,让客户端也拥有了类似服务器端Web Form生存周期的概念。这是通过配合客户端PageRequestManager对象来实现的。
PageRequestManager对象暴露出如下若干个事件,提供给我们充分的可自定发挥空间:
- initializeRequest:在该事件的处理函数中,我们可以进行一些额外的、在将请求发送回服务器端之前的附加任务,例如取消即将发出的异步请求、修改某个将要发送回服务器的参数信息等。该事件的参数为InitializeRequestEventArgs。
- beginRequest:异步请求即将发送时触发的事件,在该事件的处理函数中,我们可以显示出某段提示更新的信息(UpdateProgress控件)。该事件的参数为BeginRequestEventArgs。
- pageLoding:异步请求正在进行时触发的事件,在该事件的处理函数中,我们可以为UpdatePanel即将到来的更新进行一些准备,例如释放使用过的资源等。同样在该事件的处理函数中我们还可以及检查服务器端发送过来的状态信息,并根据不同的状态完成相应的操作控制。该事件的参数为PageLoadingEventArgs。
- pageLoaded:异步请求返回时触发的事件,在该事件的处理函数中,我们可以访问到更新完成后UpdatePanel中新的内容。该事件的参数为PageLoadedEventArgs。
- endRequest:异步请求完成时触发的事件,在该事件的处理函数中,我们可以显示更新中可能遇到的异常信息、隐藏UpdateProgress控件、或是其他一些什么别的附加操作等。该事件的参数为EndRequestEventArgs。
UpdatePanel的更新策略
ASP.NET AJAX中的UpdatePanel功能大大增强,同时其更新策略也更加复杂,列举如下(顺序同样重要!且首先请确保理解了上面一节中异步回送和整页回送的区别):
- 整页回送将更新页面中所有的UpdatePanel。
- 在服务器端调用某个UpdatePanel的Update()方法将更新该UpdatePanel。
- 若某个UpdatePanel的UpdateMode属性为Always,则任意的一次异步回送均将更新该UpdatePanel。
- 若某个UpdatePanel的UpdateMode属性为Conditional,则该UpdatePanel的AsyncPostBackTrigger所引发的异步回送将更新该UpdatePanel。
- 若某个UpdatePanel的UpdateMode属性为Conditional,且ChildrenAsTriggers属性为true时,该UpdatePanel包围的控件所引发的异步回送将更新该UpdatePanel。
使用技巧
ASP.NET AJAX中的UpdatePanel的实现方式从本质上来说和Atlas中的UpdatePanel没什么区别,所以应用于Atlas中UpdatePanel的部分使用技巧将仍旧适用,请参考:
后记
相对于ScriptManager,UpdatePanel的变化显得“仁慈”了许多,加上完善的官方文档帮助,今晚我基本上熟悉了新的UpdatePanel的使用方法。但时间同样仓促,行文依然草率,依旧没有过多润色,也没有任何的一步步的示例程序……自然也会有很多地方显得比较难懂——不过本文并不是基础的入门文章,作为从Atlas转向ASP.NET AJAX的读者,您应该能够理解文中的含义并很快对新的UpdatePanel熟悉起来。
其中错误之处,请各位不吝批评指教,或者讨论分享心得!再次感谢大家对我的支持!