Asp.Net和AJAX.Net的区别
原文:
http://www.microsoft.com/china/msdn/library/webservices/asp.net/us0501ASPNETPerformance.mspx?mfr=true
适用于:
AJAX(异步JavaScript和XML)
MicrosoftAJAX.NET
MicrosoftASP.NET
摘要:了解如何将AJAX(异步JavaScript和XML)用于您的MicrosoftASP.NET应用程序,使其互动性更强、响应更及时。
下载本文的代码示例AjaxASPNETCS.msi(使用C#语言)
下载本文的代码示例AjaxASPNETVB.msi(使用VisualBasic语言)
简介
自从开始Web编程以来,在Web应用程序和桌面应用程序之间一直存在着许多取舍。例如,人们通常认为Web应用程序提供的用户界面类型没有桌面应用程序提供的用户界面类型那样丰富。另一方面,Web应用程序是独立的平台,其开发机制比较简单。提供响应更及时的应用程序看似是一项简单的任务,但对于Web开发人员来说却是一直以来需要攻克的领域。
传统意义上,只能通过向Web服务器提交新的请求来检索对用户输入所做的响应。在某些情况下,开发人员可以使用JavaScript在客户端上加载所有响应,从而提供更好的用户体验。此技术的常见示例是基于所选国家/地区来动态加载一系列州或省。遗憾的是,在很多情况下,不将所有响应都返回或加载到JavaScript要更好。返回操作会使过多的UI断开连接,或在客户端上需要过量的数据,这经常导致生成不易读的JavaScript。AJAX提供了一种新的中间选择,能够在维持及时响应和灵活性的同时利用基于服务器的应用程序。
什么是AJAX?
AJAX是AsynchronousJavaScriptAndXML(异步JavaScript和XML)的缩写,它不是一项技术,而是很多技术的集合。AJAX使用通信技术(通常为SOAP和XML)发送和接收对服务器的异步请求/响应,然后利用显示技术(JavaScript、DOM、HTML和CSS)处理响应。如今,使用AJAX的应用程序是合法的,因为多数浏览器都支持这项必需的技术。有关AJAX更详细的定义,请访问AJAXWikipediaentry(英文)。
AJAX到底是什么?AJAX使您能够通过JavaScript调用执行服务器端方法,而不需要刷新浏览器。将它视为发生于用户后台的小型请求/响应。如果您仍不清楚AJAX是什么,请看Google上的两个常见示例:GoogleSuggests(英文)和GoogleMaps(英文)。如果您不熟悉AJAX,这两个应用程序的响应会使您有点兴奋。
用于ASP.NET的AJAX
很多因素促使AJAX应运而生。您可能不想花费几个小时或几天来了解AJAX的内部原理,而是更希望现在就开始创建启用了AJAX的应用程序,来满足现有需求(如果您确实想知道AJAX内部工作原理,我肯定不是可以询问的人)。开发人员可以用来快速入门的工具有很多。不过我们将特别关注由MichaelSchwarz编写的源代码开放的免费Ajax.NET。Ajax.NET考虑到所有的实现细节是基于.NET的,并且能够被扩展。MicrosoftASP.NET2.0通过客户端回调功能(英文)引入了独具特色的异步回调,并且最近宣布(英文)代号为“Atlas”的AJAX正在实现中。
术语可能有些混乱,但是当我介绍AJAX时,就是在介绍从客户端异步调用服务器端函数的整体框架。提到Ajax.NET时,我是指能够帮助您创建利用AJAX框架的解决方案的特定实现。
要了解有关ASP.NET2.0客户端回调功能的详细信息,请访问BertrandLeRoy的博客(英文)。
手头的AJAX
本文的剩余部分将使用Ajax.NET着重介绍三个利用AJAX功能的有意义的示例。本指南将包含以MicrosoftC#和MicrosoftVisualBasic.NET编写的代码,有时同时提供这两种代码,有时仅提供其中一种代码。实现所有这一切的代码很容易,C#开发人员能够很容易地遵循仅以VisualBasic.NET编写的代码,反之亦然!本文包含的示例C#和VisualBasic.NET项目可供下载,并提供工作代码和运行代码。在学习示例以前,首先需要了解如何安装和使用Ajax.NET。
Ajax.NET
AJAX.NET文档(英文)和网站(英文)对开发人员快速入门非常有用。在介绍使用此技术的一些具体示例之前,我们将简要回顾您所需要知道的核心步骤。
首先从AJAX.NET项目网站(英文)上下载并解压缩AJAX文件,然后按照您的喜好在VisualBasic.NET或C#中创建新的ASP.NET项目,再向AJAX.dll文件添加引用(英文)。唯一的额外配置步骤是在<system.web>元素中(位于web.config文件中)添加以下代码。
为了使服务器端函数在JavaScript中可用,必须做两件事情。首先,要使用的函数必须标有Ajax.AjaxMethodAttribute。其次,在页加载事件期间,必须通过调用Ajax.Utility.RegisterTypeForAjax来注册包含这些函数的类。听起来似乎有些复杂,但请不必担心;实际上只需要在代码中多加两行。让我们看一个示例。
以上示例首先告知Ajax.NET在Sample类中查找友好的Ajax方法。它正好是与实际页相同的类,但是它可以是任意.NET类,或可以注册多个类。然后,Ajax.NET将浏览指定的类,来查找标有AjaxMethodAttribute的所有方法,其中Sample类有一个GetMessageOfTheDay。
完成后,剩下唯一要做的就是在JavaScript中使用它。Ajax.NET自动创建与注册的类具有相同名称的JavaScript变量(在本例中将为Sample),它提供与AjaxMethod具有相同名称的函数(在本例中为GetMessageOfTheDay)。如下所示。
除了JavaScript回调函数以外,JavaScriptGetMessageOfTheDay还需要与其服务器端对应部分相同的参数(在此情况下,没有参数),以便在完成时执行并传递响应。在此,我们看到AJAX在工作时的异步特性,因为对GetMessageOfTheDay的调用不阻碍执行其他JavaScript代码,也不阻碍用户继续在页上进行操作。完成服务器端处理时,Ajax.NET调用指定的回调函数GetMessageOfTheDay_CallBack,并向其传递由服务器端返回值组成的响应。
服务器端代码和JavaScript代码之间的映射可能有些混乱。图1简要显示了服务器端代码和JavaScript代码,以及两者之间的映射。
当然令人感兴趣的Ajax.NET还有更多内容值得介绍,例如对.NET类型的支持和丰富的回调响应(它不仅仅是值)。以下示例将会重点介绍某些功能,希望帮助您理解AJAX如何帮助您创建成功的应用程序。
示例1:链接的下拉列表
本文的开始简要地讨论了用于链接两个DropDownList的两种传统方法。当选定的索引更改时,返回页;或者将所有可能的数据加载到JavaScript数组并动态显示。希望您可以看到AJAX如何替代这两种解决方案。
首先,让我们来看一下我们的数据界面,并从该数据界面驱动示例。我们的数据访问层将提供两种方法:第一种方法将检索系统支持的国家/地区的列表,第二种方法将获取国家/地区ID并返回州/省的列表。由于这是纯数据访问,因此我们只需要使用方法。
现在,让我们转到相反面,创建简单的Web窗体。
Page_Load事件同样简单,和前述的Web窗体一样。我们使用数据访问层来检索可用的国家/地区,并将其绑定到countriesDropDownList中。
通常,代码到此为止。首先,我们将创建要从JavaScript调用的服务器端函数。
这与您通常使用的任何其他函数一样:它需要我们想要获得的国家/地区的ID,并将该请求传递给DAL。唯一的不同是我们已使用AjaxMethodAttribute标记了该方法。最后剩余的服务器端步骤是通过调用RegisterTypeForAjax使用Ajax.NET来注册包含上述方法的类(在此情况下,是我们的下面的代码)。
我们已基本完成;剩余的就是从JavaScript调用GetStates方法和处理响应。当用户从国家/地区列表中选择新项时,我们想在逻辑上调用GetStates。为此,我们将触发JavaScriptonChange事件。这样就稍微更改了我们的Web窗体代码。
JavaScriptLoadStates函数将负责通过由Ajax.NET创建的代理发出异步请求。请记住,默认情况下,Ajax.NET创建的代理的格式为<RegisteredTypeName>.<ServerSideMethodName>。在我们的示例中,将为Sample.GetStates。我们还想传入国家/地区ID参数和完成服务器端函数后Ajax.NET应调用的回调函数。
最后一个步骤是处理我们的LoadStates_CallBack函数中的响应。Ajax.NET最有用的功能大概是它支持很多.NET类型(我已经多次提到这一点)。回顾一下返回DataView的服务端函数。JavaScript知道DataView什么?什么也不知道,但是JavaScript是面向对象的语言,而且Ajax.NET不只能够创建与.NETDataView相似的对象,还能将该函数返回的值映射到JavaScript副本。您应该记住JavaScriptDataView只不过是实际DataView的副本,目前除了能够遍历行和访问列值以外不支持其他更多功能(例如设置RowFilter或Sort属性的功能)。
经过一些错误检查之后,前面的JavaScript获得州下拉列表,遍历响应的值,并动态地将选项添加到该下拉列表中。代码清晰、简单并与C#和VisualBasic.NET非常相似。就我个人而言(作为基于服务器端变量创建了JavaScript数组并将它们链接在一起的开发人员),我还要一段时间才能相信它真的起作用了。
有一个可能不太明显的主要问题。由于DropDownList是在JavaScript中动态创建的,因此它的项不属于ViewState,并且不被维护。这意味着按钮的OnClick事件处理程序需要进行一些额外的修改。
首先,我们不能使用states.SelectedValue属性,而必须使用Request.Form。其次,如果我们想向用户重新显示该列表,需要重新使用相同的数据访问方法绑定州DropDownList。最后,必须以编程方式设置选定的值。
示例2:文档锁定程序
对于下一个示例,我们将引入更加完整的功能,然后使用AJAX改进它。此示例属于简单的文档管理系统。如任何正式的文档管理系统一样,我们必须提供并发管理。即,我们需要一种方法来处理两个用户尝试编辑同一个文档的问题。我们将通过创建某种类型的锁定机制,来使正在编辑的文档不能再由另一个用户编辑,从而达到上述目的。我们将利用AJAX让用户有更愉快的锁定机制体验。首先,我们将创建用户尝试编辑但无法编辑(因为其他用户正在编辑该文档)的文档队列,当这些文档可用时自动通知用户。其次,我们将确保当用户关闭其浏览器或导航到其他位置时,解除对文档的锁定。后一个功能帮助确保文档不会永远处于锁定状态。为此,在本指南中,我们将跳过与AJAX实现不相关的功能;但是,可下载项目包含所有功能。
首先,当用户尝试编辑文档时,我们会尝试对其建立排它锁,如果失败,我们会将此文档添加到用户的队列然后使其返回到主页。对此处的AJAX没有什么特别之处,但是我们将查看一下代码,以便给出示例必要的上下文。在用于编辑的Page的OnLoad事件中,添加以下代码。
关键行的位置是将文档添加到当前用户的队列中(这会将文档添加到会话中)。接下来,我们将创建用户控件,该控件可以被放置到任何页上,用于当队列文档可用时通知用户。此用户控件将包含一个AJAX方法以及注册AJAX的类所需的代码。
现在需要的是使一些JavaScript发出请求并处理响应。我们将基于响应在要动态创建的表中放置已发布的文档信息(如果有)。为此,我们将开始编写HTML。
如果没有可用的文档(或是没有为该用户列出文档),我们使用DIV标记隐藏所有内容,用TABLE标记来显示结果。我们将使用轮询系统来检查是否存在任何可用的队列文档。一般来说,这意味着我们将在稍后一段时间内一直调用服务器端方法,并显示结果。在加载页面时仅发生第一次调用,每隔X秒发生后续调用。
剩下的就是处理响应。这与以前示例中的代码相似。首先,检查是否存在错误,获得响应,遍历可用的文档,动态创建HTML,在这种情况下,向表中添加行和列。
我们要看到的最后一个快速改进是当用户关闭浏览器、导航到其他链接或单击“后退”按钮时,将自动解除文档锁定。通常,可以通过触发JavaScriptOnBeforeUnLoad事件或OnUnload事件达到此目的,这会打开新的小型弹出式窗口,该弹出式窗口在加载页面时做一些清理然后自行关闭。您自己可以使用弹出式窗口,但是其他人则不能使用,它将导致弹出式窗口受阻并使文档永久保持锁定状态。要解决此问题,我们仍需要两个JavaScript事件,但是并不是启动弹出式窗口,而是将通过AJAX执行服务器端方法。在用于编辑文档的页上(即,放置锁的页),我们添加一些简单的JavaScript。
在这里,DocumentId是在后面的代码中定义和设置的变量。另外,我们可以在会话中存储DocumentId,并在服务器端ReleaseDocument中访问。通常,ReleaseDocument从锁定的文档列表中删除文档。
示例3:论坛主题搜索
我们要看的最后一个示例是对现有应用程序的修改。我首次听到这个想法是JoshLedgard(英文)设想在MSDN论坛(英文)里添加一个功能。目的是尝试帮助用户自己找到问题的答案,以及限制重复发布的数量。一般来说,用户在论坛中提出新问题时,他或她会输入主题和问题。他们通常都不会先进行搜索,来查看是否已经提出和回答过该问题。输入AJAX。用户输入主题(并将Tab键移出该字段)后,我们基于该主题异步搜索论坛,并适时地向用户显示结果。有时这些结果会有帮助,有时候则不会。
为使结果有帮助,我们将修改asp.NETPROReader"sChoiceAwardforBestForumApplication,CommunityServer。可下载的示例中不包含这一部分(或论坛)的代码,但是您能在http://communityserver.org/(英文)学到关于CommunityServer的更多知识,并且可在其中应用下面这些代码片断。
安装CommunityServer并配置Ajax.NET(已将引用和处理程序添加到web.config)后,我们只需要进行一些更改就可以获得所需的功能。首先,我们转到CommunityServerForums项目中的CreateEditPost.cs文件。将它视为此页的后面的代码,其中用户可以添加新的发布。下面我们将添加启用了AJAX的函数。
我们能够利用已经在CommunityServer中创建的搜索功能,只需要我们的函数能应用它。如往常一样,类型必须使用Ajax.NET注册。我们将在同一文件的InitializeSkin函数(将其视为Page_Load)中进行此操作。
在转跳到JavaScript之前,我们需要进行最后的服务器端更改。返回到Ajax.NET的自定义类(例如我们正在返回的ArrayList所包含的ForumPost)必须标有Serializable属性。我们要做的是转到CommunityServerForums项目中的Components/ForumPost.cs文件,并添加此属性。
显示时,我们仅需要修改CommunityServerWeb项目中的Themes/default/Skins/View-EditCreatePost.cs。首先,我们将触发主题文本框的onBlur事件。
接着,我们编写JavaScriptSearch方法,以便调用服务器端Search。
最后,剩下的就是处理响应。由于上一个示例介绍了在表中显示结果的稍微正规的方式,我们将仅仅创建一些动态的HTML,并将它粘贴到虚拟的DIV中。
通过对CommunityServer应用程序的三个文件(加上用于配置的web.config)稍微进行修改,我们可以添加一些非常有用的功能。但是,只向现有的应用程序添加启用AJAX功能时要小心操作。正在进行实际搜索的预先存在的ForumSearch类可能并不是为我们介绍的使用类型设计的。我们的代码很可能会导致执行一些额外的搜索,影响可能会很显著。
AJAX与您
AJAX如何以及哪里适合您的应用程序,以及是否已经存在要根据情况而定。尽管我们已经看到使用Ajax.NET可以轻松地创建启用AJAX的解决方案,但还存在一些其他的注意事项。一个需要着重关注的问题是对您的应用程序的整体体系结构和可维护性的影响。AJAX会进一步模糊系统的各层之间的界限,显著影响显示层、显示逻辑层和业务层。这不是AJAX本身的问题,而是使用方式的问题。只要您知道它很容易导致各层之间的某些冲突,并适当操作,就不会产生问题。
使用AJAX的应用程序更难于维护吗?答案主要取决于您已经使用的JavaScript的数量,以及您组织和维护它的好坏程度。很多开发人员认为JavaScript难于编写、测试和调试(不是因为JavaScript本身,而是因为工具支持和开发人员的知识)。如果您当前正在使用JavaScript实现链接的下拉列表,并切换到AJAX,您的代码可能较为容易维护(Ajax.NET对.NET类型和数组的支持是重要原因)。但是,如果您使用返回方式来实现,现在您将向您的应用程序(JavaScript)引入崭新的语言。您将必须处理这样的情况:存在某些不参与ViewState的数据(这一点我们在按钮单击事件中可以看到)。
另一个需要考虑的是AJAX对您的网站可用性的影响。即使AJAX最后能创建响应更及时的界面,开发人员仍需要注意两件事情。首先,很明显AJAX依赖JavaScript。我们都知道一些用户禁用JavaScript,一些标准(例如加拿大政府CommonLookandFeel[考虑加拿大的508])要求网站使用JavaScript来运行,或不使用它来运行。因此,您不应假定AJAX功能正在运行。如果AJAX功能不可用,则应使您的应用程序退回到更普通的Web处理。其次,AJAX应用程序可能不熟悉(即使它具有较高级别)用户习惯使用应用程序的方式。例如,通过AJAX执行不同功能的页可能不以用户认为的方式表现“后退”按钮、“收藏夹”菜单和其他浏览器功能。
结论
AJAX不只是令人兴奋的即将面世的技术,它是具体的框架,在建立Web应用程序时可以采用它来解决每天遇到的问题。Ajax.NET使ASP.NET开发人员轻松掌握AJAX。我们看到的三个示例和可下载的项目可以帮助您了解如何使用AJAX和Ajax.NET。您还可以利用这些示例来尝试一些自己的想法。AJAX不仅可以创建简洁和强大的应用程序,它还可以使您提高客户满意度和竞争优势。正在讨论的Atlas的一些高级概念可能显著改进我们提供的产品。就个人而言,我见过的最佳的AJAX实现非常轻便合适。您自己的实现应为您的用户提供同样积极的体验。但是,对于某个具体问题,记住AJAX可能不是唯一的解决方案,也可能不是最佳的解决方案。现在,让我们证明ASP.NET社区是首屈一指的,让我们收拾屋子吧。
关于作者
KarlSeguin将他的大部分时间用在MicrosoftASP.NET新闻组,帮助其他开发人员并寻找和编写帮助性的主题。当他不工作或不提供帮助时,他喜欢无情地清洁Gnomish灾难的Azeroth。
转到原英文页面
相关文章
- RadControls for ASP.NET Ajax 笔记(2)[通俗易懂]
- ASP.net错误:Control’ctl00_ctl00_ContentPlaceHolder2[通俗易懂]
- .netLinux下部署ASP.NET环境指南(linux部署asp)
- .net搭建ASP.NET应用程序在Linux系统上(linux搭建asp)
- .netLinux与ASP.NET:构建高性能网络应用(linuxasp)
- ASP.NET WebForm也可以这样用Ajax(程序猿,你知道不)
- 从ASP到MySQL改进你的代码(asp改MySQL代码)
- asp.net下用js实现鼠标移至小图,自动显示相应大图
- 在Apache环境下成功的运行ASP.NET的注意事项
- asp.net网站安全从小做起与防范小结
- asp.net数据库的连接和datatable类
- asp.net动态添加多个用户控件
- ASP.NET(AJAX+JSON)实现对象调用
- asp.net中利用ajax获取动态创建表中文本框的值
- asp页面和Asp.net页面传中文参数UrlEncode编码以及接收解码
- asp.net下用Aspose.Wordsfor.NET动态生成word文档中的数据表格的方法
- 点击图片,AJAX删除后台图片文件的实现代码(asp.net)
- TreeView用法(有代码)(asp.net)
- asp.net+Ajax校验用户是否存在的实现代码
- asp.net身份验证方式介绍
- Ajax+asp.net智能匹配检索(含图含完整代码)
- 浅析ASP.NET安全性分析(加强asp.net1.1/2.0安全性)
- asp.net中在用ajax格式传递数据到aspx页面时出现乱码
- 使用asp.net的pageDataSource中时索引问题解决方法
- ASP.NET页面某些选项进行提示判断具体实现
- ASP.NET中使用Ajax的方法
- ASP.NET中TextBox使用Ajax控件显示日期不全的问题解决方法
- ASP.NET中MVC使用AJAX调用JsonResult方法并返回自定义错误信息
- ASP.NET实现读取Excel内容并在Web上显示