Ajax技术加强了很多ASP.NET本身的弱项。本章要继续讨论的Ajax基本技术是:
n ASP.NET Ajax 基本框架
n ASP.NET Ajax Library
n 多浏览器兼容层
n 微软Ajax库
n 了解客户端事件循环周期
n 服务端组件和控件
n Javascript文件
n 理解ASP.NET Ajax 配置文件Web.config
ASP.NET Ajax基本框架
Ajax模式下,web程序由以前的单服务端处理变成了客户端和服务端共同工作的情况。在客户端包括了ASP.NET AJAX 基于客户端的扩展(包括JavaScript库,控件,等等),javascript代码和HTML,在服务端包含了IIS,ASP.NET 运行库(.NET Framwork 和 ASP.NET 组件)以及ASP.NET AJAX基于服务的扩展包(控件,组件,程序集等等)。
代码库
Code Library在ASP.NET Ajax中分为两个主要物理块: 客户端功能块和服务端功能块。他包含了所有的JavaScript文件,正是这些文件时ASP.NET Ajax工作的魔力源泉。JavaScript文件包含了丰富的面向对象模型的代码。虽然服务端的功能需要Microsoft Ajax Library的支持,但是对客户端功能却并非是必须的,这使得他可以运行在任何服务器平台上,包括Linux,Apache等等。
ASP.NET AJAX还提供了一个服务端运行库,包括一系列组件和控件,如updatePanel,通过updatePanel可以使Ajax开发更加快捷甚至零代码。从开发者的角度来看,客户端层和服务端层经常要在一起协作,不过他们的工作是很简单的。比如你正开发一个服务端功能,你可能会使用updatePanel,然后你不需要对客户端进行编码,因为updatePanel已经为你做好了,你只需要一些简单的开发。
多浏览器兼容层
Microsoft Ajax 运行库已经是以跨浏览的目标编写的,因此,这些javascript代码都是可以跨常用的浏览器运行的,幸运的是,这些都是自动完成的。我们不需要担心,但是为了使我们自己写的代码能够跨浏览器,我们最好能对Microsoft Ajax运行库进行深入的了解和学习。
Microsoft Ajax运行库
新的javascript推荐使用以面向对象机制进行编码,并且加入的类,继承,接口,命名空间,媒介和反射。Javascript还变得使C#开发人员更加熟悉,因为他加入StringBuilder和Timers。下面是Microsoft Ajax运行库的命名空间结构:
命名空间 |
描述 |
Global |
包括 array,Boolean,String,error,Number和对象等javascript已有的类型的扩展。 |
Sys |
类似于.NET Framework的System,是命名空间的根元素,包括了一些基本的类,Application和stringBuilder等。还包括了一些常用的接口,如IDisposable和INotifyPropertyChange等。 |
Sys.Net |
包含了网络通信的一些基本对象,如WebRequest,XMLHttpExccutor等,Sys.Net本质上是对客户端/服务端通信的压缩封装。 |
Sys.Serialization |
用于在服务器和客户端通信时的对象序列化操作。 |
Sys.Webforms |
包含PageRequestManager等对象,是ASP.NET Ajax局部刷新技术的划分(?) |
Sys.UI |
包含了用户接口有关的机制,如控件,事件和枚举等等。 |
Sys.Services |
提供对ASP.NET 服务端服务,如验证和profile service。 |
在ASP.NET Ajax中javascript编程变得越来越想C#编程,正是微软的努力使的.NET开发人员能更快的掌握JavaScript编程,并进行快速开发。
Client-Side 事件循环周期
正如ASP.NET的服务器循环周期一样(一连串的OnPreLoad,OnLoad事件等)。ASP.NET Ajax也存在一个客户端循环周期。了解这个周期将使你更加深刻的了解ASP.NET Ajax技术原理。
事件 |
描述 |
InitializeRequest |
当异步请求第一次初始化时激发此事件,在这里可以检测请求并决定是否通行。 |
beginRequest |
当ASP.NET Ajax准备完毕并向服务器提交请求之前激发,这通常用来向用户显示一个提示信息,表示请求开始。 |
PageLoading |
当客户端获得服务器响应并刷新页面之前激发。 |
pageLoaded |
在初始化页面载入时激发的唯一事件。 |
EndRequest |
当页面获得服务器响应并显示相应结果后激发,这里通常可以隐藏先前的提示信息,并表示请求周期结束。 |
这些事件可以通过PageRequestManager类来访问,后面的章节会提供一个例子演示。
服务端组件和控件
ASP.NET Ajax提供了新的组件,控件和类。这些基于服务端的功能深深依赖于Microsoft Ajax library中的javascript类。
当你安装完ASP.NET Ajax以后,在机器的全局程序集缓存(Global Assembly Cache,在系统跟目录下)将会添加System.Web.Extensions 程序集。通过该程序集我们就可以进行基于服务端的新组件,控件的开发了。
服务端命名空间 |
描述 |
System.Web.Configuration |
提供对ASP.NET Ajax 配置文件Web.config的控制。 |
System.Web.Handlers |
提供对script下载最优化支持。 |
System.Web.Script.Serlialization |
提供了对JSON的序列化和反序列化扩展。 |
System.Web.Script.Services |
提供对webService的调用功能。 |
System.Web.UI |
提供了script管理功能和网络通信代码 |
System.Web.UI命名空间包含了大部分服务端功能模块。它的一些子空间如System.Web.UI.Compatability是重要的空间扩展了ASP.NET 验证控件的功能。System.Web.UI.Design控件提供了对ASP.NET Ajax自定义扩展功能。
服务端控件 |
控件描述 |
ScriptManager |
运行时隐藏,是每个Ajax页面必须的控件并且只能有一个实例,管理着客户端脚本。 |
ScriptManagerProxy |
运行时隐藏,在母版结构页面中使用。 |
UpdatePanel |
在updatepanel内部的控件都能够获得局部刷新的支持。 |
UpdateProgress |
显示了一个状态用于长时间的异步请求提示信息。 |
Timer |
按指定时间周期执行客户端事件。 |
ScriptManager管理着客户端脚本文件,提供了更有效的载入支持。并提供一些错误处理,更多的配置会在以后研究。
当使用母版页时,你就会用到ScriptManagerProxy控件,具体方法暂时不多讨论。
Updatepanel提供了一种最快最简单的局部刷新技术,他决定了页面哪些部分会局部刷新,所有在他内部的控件都可以获得局部刷新支持。这些刷新可以被一系列事件或Timer控件触发,更多讨论会在后面提及。
当访问数据库等比较耗时的请求时,updateprocess控件就可以提供一个动态的提示信息用于通知用户,请求正在执行。具体用法会在后面提及。
Timer控件用法也比较简单。
JavaScript文件
Javascript文件保存在program files\microsoft ASP.NET\ASP.NET 2.0 Ajax Extensions\V1.0.x\MicrosoftAjaxLibrary\System.Web.Extensions\V1.0.x 文件夹下。主要包括:
文件 |
说明 |
MicrosoftAjax.js |
最常见的javascript文件,包含了大多数Ajax库的代码。 |
MicrosoftAjaxWebForms.js |
包含了ASP.NET Ajax WebForms框架代码。 |
MicrosoftAjaxTimer.js |
Timer控件的代码,比较小的文件。 |
理解ASP.NET Ajax 配置文件Web.config
<configuration>
<sectionname="profileService"type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"requirePermission="false"allowDefinition="MachineToApplication" />
<sectionname="authenticationService"type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"requirePermission="false"allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
</configSections>
<profileService>模块主要用于在你的网站需要记录用户个人信息的时候,比如当你需要记录某个用户拖拽的位置信息,此时会用到该属性。具体应用会在后面提及。
< authenticationService>模块主要用于网站用户控制,当你的网站是匿名访问时就不需要该项功能.
<pages>
<controls>
<addtagPrefix="asp"namespace="System.Web.UI"assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</controls>
</pages>
这项模块在全局注册了Ajax服务器控件,从而使的每个页面不需要重复引用.
<compilationdebug="false">
<assemblies>
<addassembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>
</compilation>
编译模块定义了页面的测试属性,在调试时一般将debug设置为true从而使页面提供更多的调试信息,当网站发布时应该将其设置为false.
<httpHandlers>
<removeverb="*"path="*.asmx"/>
<addverb="*"path="*.asmx"validate="false"type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<addverb="*"path="*_AppService.axd"validate="false"type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<addverb="GET,HEAD"path="ScriptResource.axd"type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"validate="false"/>
</httpHandlers>
Remove模块移去了asp.net默认的webservice方式,add模块在随后定义了ASP.NET Ajax方式的webservice.最后一项add部分定义了脚本文件应该通过ASP.NET Ajax HTTP handler方式下载从而具有更高的性能和合理的顺序.
<httpModules>
<addname="ScriptModule"type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
</system.web>
这项定注册了Ajax使用的HTTP Model.