第10章UpdatePanel控件为了让程序员能够方便地把ASP.NETAJAX技术应用于自己的网站开发中,ASP.NETAJAX框架提供了服务器控件。服务器控件主要包括UpdatePanel控件、UpdateProgress控件、Timer控件和ScriptManager控件。从本章开始,分四章分别详细介绍一下有关这些控件的知识以及用法,本章首先介绍UpdatePanel控件。10.1UpdatePanel控件概述使用ASP.NETUpdatePanel控件,可以创建丰富的以客户端为中心的Web应用程序。通过使用UpdatePanel控件,可以刷新选定的页面部件,而不是刷新整个页面,这就是所谓的部分页面刷新。一个包含一个ScriptManager控件和一个或多个UpdatePanel控件的Web页面可以自动执行部分页面刷新,而且不需要任何客户端脚本。10.1.1应用场景UpdatePanel控件是一个服务器控件,它能够帮助程序员开发具有复杂客户端行为的Web页面,它能够使页面对终端用户更具有吸引力。协调服务器和客户端以更新一个页面的指定部位,通常需要具有很深的ECMAScript(JavaScript)知识。然而,使用UpdatePanel控件,可以让页面实现局部更新,而且不需要编写任何客户端脚本。此外,如果有必要的话,可以添加定制的客户端脚本以提高客户端的用户体验。当使用UpdatePanel控件时,页面上的行为具有浏览器独立性,并且能够潜在的减少客户端和服务器之间数据量的传输。10.1.2运行机理UpdatePanel控件能够刷新指定的页面区域,而不是刷新整个页面。整个过程是由服务器控件ScriptManager和客户端类PageRequestManager来进行协调的。当部分页面更新被激活时,控件能够被异步地传递到服务器端。异步的传递行为就像通常的页面传递行为一样,所产生的服务器页面执行能够页面和控制页面生命周期。然而,随着一个异步的页面传递,页面更新局限于被UpdatePanel控件包含和被标识为要更新的页面区域。服务器只为那些受到影响的浏览器元素返回HTML标记。在浏览器中,客户端类PageRequestManager执行文档对象模型(DOM)的操纵,以使用更新的标记来替换当前存在的HTML片段。图10-1显示了一个页面第一次装载的情形和其后异步传送刷新一个UpdatePanel控件内容的情形。图10-1部分页面构建过程要使UpdatePanel控件实现局部页面更新,需要在页面中同时添加一个ScriptManager控件。默认情况下,局部页面更新是启用的,因为ScriptManager控件的属性EnablePartialRendering的默认值是true。下面的例子展示了在一个页面中定义一个ScriptManager控件和一个UpdatePanel控件的标记。例Sample10-1的代码如下:UpdatePanel控件中包含一个Button控件,这个控件用来被单击时刷新面板内的内容。默认情况下,属性ChildrenAsTriggers是true。因此,Button控件执行一个异步传送的控制。!DOCTYPEhtmlPUBLIC-//W3C//DTDXHTML1.0Transitional//EN==servertitleUpdatePanel例子/titlestyletype=text/cssbody{font-family:LucidaSansUnicode;font-size:10pt;}button{font-family:tahoma;font-size:8pt;}/style/headbodyformid=form1runat=serverdivasp:ScriptManagerID=ScriptManagerrunat=server/asp:UpdatePanelID=UpdatePanel1UpdateMode=Conditionalrunat=serverContentTemplatefieldsetlegendUpdatePanel内容/legend!--Othercontentinthepanel.--%=DateTime.Now.ToString()%br/asp:ButtonID=Button1Text=刷新runat=server//fieldset/ContentTemplate/asp:UpdatePanel/div/form/body/html以上代码的运行效果如图10-2所示。图10-2UpdatePanel应用案例10.2UpdatePanel控件的属性和方法UpdatePanel控件提供了很多属性和方法以方便用户的使用,这里就其中常用的属性和方法做个介绍。10.2.1属性UpdatePanel控件的重要属性如表10-1所示。表10-1UpdatePanel控件的重要属性属性说明ChildrenAsTriggers当属性UpdateMode为Condition时,UpdatePanel中的子控件的异步传送是否引发UpdatePanel控件的更新。RenderMode表示UpdatePanel控件昀终呈现的HTML元素。其中值Block表示div,Inline表示span。UpdateMode表示UpdatePanel控件的更新模式。其中值Always是不管有没有Trigger,其它控件都将更新更新该UpdatePanel控件,Conditional表示只有当前UpdatePanel控件的Trigger,或ChildrenTriggers属性为true时当前UpdatePanel控件中的控件引发的异步回送或整页回送,或是服务器端调用Update()方法才回引发更新该UpdatePanel控件。10.2.2方法UpdatePanel控件的重要方法如表10-2所示。表10-2UpdatePanel控件的重要方法方法说明Update()对UpdatePanel控件的内容进行更新。OpenFile(String)读取一个文件到文件流中。DataBind()绑定一个数据源。10.3UpdatePanel控件的用法UpdatePanel控件是实现部分刷新的关键控件,下面就介绍该控件的详细用法。10.3.1指定UpdatePanel控件的内容可以以声明的方式向UpdatePanel控件内添加内容或在设计器中使用ContentTemplate属性来添加内容。在标记中,ContentTemplate属性以ContentTemplate元素形式显示出来。为了能够以编程的方式添加内容,可以使用ContentTemplateContainer属性。当一个包含一个或多个UpdatePanel控件的页面第一次被构建时,所有的UpdatePanel控件的内容被构建并且发送到浏览器中。在随后的异步传送中,单独的UpdatePanel控件的内容会被刷新。而内容的更新依赖于面板的设置,依赖于什么元素导致传送和专门指定给每个面板的代码。10.3.2指定UpdatePanel的触发器默认情况下,任何在UpdatePanel控件中的回送控件都会引起异步回送和刷新面板的内容。当然,也可以配置页面上的其它控件以刷新一个UpdatePanel控件,可以通过为该控件定义一个触发器实现配置。触发器用来绑定哪个回送控件和事件引发面板的更新。当被指定的触发器控件的事件被触发(例如,Button控件的Click事件)时,要更新的面板被刷新。下面这个例子用来说明如何为一个UpdatePanel控件指定一个触发器。例Sample10-2的代码如下:以下代码中为UpdatePanel控件定义了一个触发器,触发器的定义放在标记Triggers中,由类AsyncPostBackTrigger来定义,其中使用该类的属性ControlID绑定指定的控件Button1。htmlxmlns==Head1runat=servertitleUpdatePanel声明语法/titlestyletype=text/cssbody{font-family:LucidaSansUnicode;font-size:10pt;}button{font-family:tahoma;font-size:8pt;}/style/headbodyformid=form1runat=serverdivasp:ButtonID=Button1Text=刷新runat=server/asp:ScriptManagerID=ScriptManager1runat=server/asp:UpdatePanelID=UpdatePanel1UpdateMode=Conditionalrunat=serverTriggersasp:AsyncPostBackTriggerControlID=Button1//TriggersContentTemplatefieldsetlegendUpdatePanel内容/legend%=DateTime.Now.ToString()%/fieldset/ContentTemplate/asp:UpdatePanel/div/form/body/html以上代码的运行效果如图10-3所示。图10-3触发器的应用效果触发器的控件事件是可选择的,如果没有指定一个事件,触发器事件是控件的默认事件,例如,Button控件的默认事件是Click事件。10.3.3UpdatePanel控件的刷新条件下面描述了UpdatePanel控件的属性设置以决定在局部页面构建期间何时更新面板的内容。如果UpdateMode属性设置为Always,UpdatePanel控件的内容在源于页面的任何地方的每次回送发生时都被更新,这包括来自其它UpdatePanel控件里的控件的异步回送,以及来自那些不在UpdatePanel控件里的控件的异步回送。如果UpdateMode属性设置为Conditional,UpdatePanel控件的内容在如下任何一个为true时被更新:●当回送是由那个UpdatePanel控件的触发器引用的。●当明确地调用UpdatePanel控件的Update()方法。●当UpdatePanel控件被放在另一个UpdatePanel控件内且父UpdatePanel控件进行更新时。●当ChildrenAsTriggers属性被设置为true,而且UpdatePanel控件的任何子控件引起一个回送。UpdatePanel控件的子控件不能引发外面的UpdatePanel控件的更新,除非他们被明确地定义为父面板的触发器。此外,如果ChildrenAsTriggers属性被设置为false时,而且UpdateMode属性被设置为Always,就会引发一个异常。ChildrenAsTriggers属性只能在UpdateMode属性为Conditional时才可以使用。10.3.4在Master页中使用UpdatePanel控件为了在Master页中应用UpdatePanel控件,需要决定如何包含ScriptManager控件。如果在Master页中包含ScriptManager控件,这样Master页就可以在内容页中充当ScriptManager控件。(如果想要在内容页中明确地注册脚本和服务,可以往那个内容页中添加一个ScriptManagerProxy控件。