1.认识ASP.NET Ajax
(1)ASP.NET Ajax框架
ASP.NET Ajax框架是在.NET框架的基础上通过扩展具有Ajax功能的客户端脚本库和服务器组件,并将二者集成在一起的一种可靠的开发框架。客户端主要由Microsoft Ajax Library组成,提供了创建客户端组件、浏览器兼容、网络支持及核心服务等功能,其结构如图8-1所示。服务器端提供了客户端脚本支持、服务器控件、Web服务和应用程序服务等功能,服务器端结构如图8-2所示。

图8-1 ASP.NET Ajax客户端结构

图8-2 ASP.NET Ajax服务器端结构
(2)ASP.NET Ajax组成
ASP.NET Ajax主要由ASP.NET Ajax Extensions、ASP.NET Ajax Control Toolkit、ASP.NET AjaxFeatureCTP以及Microsoft Ajax Library等4部分组成,其各自的功能及作用介绍如下。
1)ASP.NET Ajax Extensions是ASP.NET Ajax的核心,它集成了ASP.NET Ajax在服务器端及客户端的功能,使开发者既能开发以服务器端为中心,又能开发以客户端为中心的Ajax应用程序。
在.NET 3.5未推出前,ASP.NET Ajax Extensions作为一个独立的程序被安装部署到.NET 2.0上,其发布版本为ASP.NET 2.0 Ajax Extensions 1.0。配合VS 2005,开发人员很轻松便能开发具有Ajax功能的应用程序。从.NET 3.5开始,ASP.NET Ajax Extensions已为ASP.NET所固有。当使用VS 2008创建.NET3.5应用程序时,开发人员可以在工具箱的AJAX Extensions选项卡中找到核心ASP.NET Ajax服务器控件。同时在Web.Config文件中也已经具有AJAX注册设置。
ASP.NET Ajax Extensions主要由5个核心服务器控件组成,分别为:
●ScriptManager:脚本管理器。
●ScriptManagerProxy:脚本管理器助理。当页面或页面嵌套时需使用多个脚本管理器
来对Ajax控件进行管理时使用。
●UpdatePanel:无刷新或局部更新控件。
●UpdateProgress:加载提示控件。
●Timer:定时器。
2)ASP.NET Ajax Control Toolkit是微软技术社区开发的Ajax扩展工具包,提供了自动完成、智能密码强度提示、动态折叠面板等几十种用户的Ajax扩展控件。目前,ASP.NET Ajax Control Toolkit安装包有3个版本,Ajax Control Toolkit(基于.NET 2.0)、Ajax Control Toolkit.Binary.NET 3.5(基于.NET 3.5)及Ajax Control Toolkit.Binary.NET 4.0(基于.NET4.0)。开发人员可以通过官网(http://ajaxcontroltoolkit.codeplex.com)下载。
3)ASP.NET Ajax Features CTP是提供给开发人员研究用的Ajax控件包。它包含一些正处于测试研究阶段的功能和控件,所以没有正式发布用于实际项目开发。
4)Miscrosoft Ajax Librabry又称为Ajax脚本库,由几个.js文件组成,可为开发人员提供预定义的服务和工具。它能运用在任何接受JavaScript的编程环境中。
2.ScriptManager
ScriptManager是页面管理器,用于管理页面中的Ajax控件及脚本。它能够放置在任何ASP.NET所支持的页面上,并且每个页面有且只能放置一个。若遇到页面嵌套需要使用多个ScriptManager控件的时候,可以选择将其放置在母版页或在页面中只保留一个,其他用ScriptManagerProxy替代。
ScriptManager控件使用起来非常简单,只需将其从工具箱的AJAX Extensions选项卡拖拽到页面中。ScriptManager控件并不进行实际的用户操作,但缺了它页面上的其他Ajax控件都无法工作。所以,在开发Ajax应用程序时,页面上一定要先添加ScriptManager控件,再添加其他Ajax控件,否则会产生脚本错误。
(1)ScriptManager属性
ScriptManager控件具有多个属性,能为ASP.NET页面提供局部刷新、页面错误信息提示、动态引入脚本及动态引入Web服务等功能。表8-1所示为ScriptManager控件的几个常见属性。
表8-1 ScriptManager控件常见属性说明

(2)使用ScriptManager在UpdatePanel上弹出消息提示框
消息提示框常用于客户向服务器发出的请求执行完后,服务器向客户反馈处理结果的情况,如图8-3所示。这种方式方便、友好、易实现,实现代码如下:


图8-3 消息提示框
但是,上述代码无法在UpdatePanel上弹出消息框。由于Response.Write()方法的调用对象是Page,而当前发生更新的是UpdatePanel控件,因此无法向Web窗体注册脚本。所幸,ScriptManager控件具有向Web窗体注册脚本的方法—RegisterStartupScript()和RegisterClientScriptBlock()。调用这两种方法所需的参数数量及参数类型都一样,详细参数介绍如下。
●Page/Control:Page或Control类型。用于接收正在注册该客户端脚本块的页面/控件。
●Type:Type类型。用于接收该客户端脚本块的类型。通常指定该参数为“注册脚本块对象.GetType()”。(https://www.xing528.com)
●Key:String类型。用于接收该脚本块的唯一标识。该参数可设置为空字符串。
●Script:String类型。用于接收脚本代码。
●AddScriptTags:Boolean类型。该参数只有“true”与“false”两个值,设置为“true”表示用<script>和</script>标记括起该脚本块,为“false”则无。
使用ScriptManager控件实现在UpdatePanel上弹出消息框的执行代码如下所示。
1)调用RegisterClientScriptBlock()方法:

2)调用RegisterStartupScript()方法:

3.UpdatePanel
UpdatePanel控件又称为局部刷新控件,它通过异步传输的方式使其区域中的内容可以实时更新,又不需将整个页面回发给服务器。不仅提高了服务器的执行效率,还提升了页面的响应能力,给客户带来更好的体验。UpdatePanel控件是ASP.NET Ajax中一个非常重要的控件,也深受广大开发人员青睐。其不必回发页面便能执行更新的功能也经常被开发人员用于实现无刷新的Web页面环境。
(1)初步使用UpdatePanel进行局部更新
使用UpdatePanel控件进行局部更新最简单的方法就是将页面中需要更新的内容及执行更新的控件放置在UpdatePanel中。这样,只要UpdatePanel区域内的控件事件被执行,就能触发UpdatePanel的内容进行更新,而UpdatePanel外的内容保持不变。
假设对窗体的Page_Load事件编写代码“LabTime.Text=DateTime.Now.ToString();”用于在页面回发或初始化时更新LabTime的初始时间。同时对UpdatePanel内ButUp按钮的Click事件编写代码“LbUp.Text=DateTime.Now.ToString();”用于更新UpdatePanel内LbUp的初始时间。当连续单击ButUp按钮时,我们会发现LabTime的时间始终保持不变,而LbUp的时间时时发生变化。页面代码如下。

上述代码中<ContentTemplate>和</ContentTemplate>是UpdatePanel控件内容模板的起始和结束标识符。任何控件代码只有添加在该标识符内才能正常显示及使用,否则会引起UpdatePanel创建错误。
这种局部更新方法有个局限,执行更新事件的控件只能更新UpdatePanel控件的内容。若执行更新事件的控件不在UpdatePanel内就不适用了。
(2)使用Triggers控制UpdatePanel进行内容更新
Triggers是UpdatePanel控件非常有用的属性。它是一个触发器集合,可以为UpdatePanel控件的更新指定一个或多个触发器。Triggers含有两种类型的触发器对象——AsyncPostBackTrigger和PostBackTrigger,分别触发UpdatePanel控件进行局部更新和整页回传。这两个对象拥有相同的属性,详细属性介绍如表8-2所示。
表8-2 Triggers触发器对象属性说明

1)使用UpdatePanel区域外的控件进行内容更新。
UpdatePanel区域内的控件事件总是能触发其更新内容,并保持UpdatePanel区域外的内容始终不变。而区域外的控件要保证只有UpdatePanel的内容更新就需要通过Triggers来控制。
假设对窗体的Page_Load事件编写代码“LabTime.Text=DateTime.Now.ToString();”用于在页面回发或初始化时更新LabTime的初始时间。同时对UpdatePanel外ButUp按钮的Click事件编写代码“LbUp.Text=DateTime.Now.ToString();”用于更新UpdatePanel内LbUp的初始时间。我们首先要为UpdatePanel添加一个Triggers,然后设置其更新方式及控制ID。页面代码如下。

上述代码实现了局部更新的效果,如整页回传,只需将<asp:AsyncPostBackTrigger/>标签换成<asp:PostBackTrigger/>即可,其余设置不变,本章将不再进行介绍。
2)多个UpdatePanel控件进行同时更新。
UpdatePanel控件的UpdateMode属性可以为UpdatePanel控件指定一种更新方式。该属性值默认为“Always”,这意味着当多个UpdatePanel控件存在于同一页面上的时候,只要有一个UpdatePanel控件被触发更新,其他的UpdatePanel控件也会同时更新内容。利用UpdateMode默认属性值的这一特性,我们有以下几种方法可以控制多个UpdatePanel控件进行同时更新。
①将触发更新的控件放在任一个UpdatePanel控件内。
②当触发更新的控件不在任一个UpdatePanel控件内时,将其中一个UpdatePanel控件Triggers对象的ControlID属性指向触发更新的控件。
(3)使用UpdateMode属性改变UpdatePanel的更新方式
UpdateMode属性有两种值:Always和Conditional,分别控制UpdatePanel总是执行更新或有条件更新。如果读者希望控制页面上任一UpdatePanel的内容更新只能由它内部的Web控件或它自身Triggers对象所指向的Web控件触发,那就需要将UpdatePanel的UpdateMode属性设置为Conditional。
假设对窗体的Page_Load事件编写代码“LabTime.Text=DateTime.Now.ToString();”用于在页面回发或初始化时更新LabTime的初始时间。同时对UpdatePanel外的ButUp1按钮与ButUp2按钮的Click事件分别编写代码“LbUp1.Text=DateTime.Now.ToString();”用于更新UpdatePanel1内LbUp1的初始时间,“LbUp2.Text=DateTime.Now.ToString();”用于更新UpdatePanel2内LbUp2的初始时间。然后分别设置好UpdatePanel1与UpdatePanel2的Triggers属性,再将它们的UpdateMode属性都设置为Conditional。当单击其中一个按钮时,读者会发现只有Triggers对象的ControlID属性指向该按钮的UpdatePanel内LbUp的时间发生变化。页面代码如下。

由此可见,UpdateMode属性需要与Triggers合理搭配才能自由控制页面中哪个UpdatePanel控件需要更新,哪个不需要。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
