Asp.Net 和 AJAX.Net 的区别


原文:
http://www.microsoft.com/china/msdn/library/webservices/asp.net/us0501ASPNETPerformance.mspx?mfr=true

适用于:
AJAX(异步 JavaScript 和 XML)
Microsoft AJAX.NET
Microsoft ASP.NET

摘要:了解如何将 AJAX(异步 JavaScript 和 XML)用于您的 Microsoft ASP.NET 应用程序,使其互动性更强、响应更及时 。

下载本文的代码示例 AjaxASPNETCS.msi(使用 C# 语言)

下载本文的代码示例 AjaxASPNETVB.msi(使用 Visual Basic 语言)

本页内容
简介 简介
什么是 AJAX? 什么是 AJAX?
用于 ASP.NET 的 AJAX 用于 ASP.NET 的 AJAX
手头的 AJAX 手头的 AJAX
AJAX 与您 AJAX 与您
结论 结论

简介

自从开始 Web 编程以来,在 Web 应用程序和桌面应用程序之间一直存在着许多取舍 。例如,人们通常认为 Web 应用程序提供的用户界面类型没有桌面应用程序提供的用户界面类型那样丰富 。另一方面,Web 应用程序是独立的平台,其开发机制比较简单 。提供响应更及时的应用程序看似是一项简单的任务,但对于 Web 开发人员来说却是一直以来需要攻克的领域 。

传统意义上,只能通过向 Web 服务器提交新的请求来检索对用户输入所做的响应 。在某些情况下,开发人员可以使用 JavaScript 在客户端上加载所有响应,从而提供更好的用户体验 。此技术的常见示例是基于所选国家/地区来动态加载一系列州或省 。遗憾的是,在很多情况下,不将所有响应都返回或加载到 JavaScript 要更好 。返回操作会使过多的 UI 断开连接,或在客户端上需要过量的数据,这经常导致生成不易读的 JavaScript 。AJAX 提供了一种新的中间选择,能够在维持及时响应和灵活性的同时利用基于服务器的应用程序 。

返回页首返回页首

什么是 AJAX?

AJAX 是 Asynchronous JavaScript And XML(异步 JavaScript 和 XML)的缩写,它不是一项技术,而是很多技术的集合 。AJAX 使用通信技术(通常为 SOAP 和 XML)发送和接收对服务器的异步请求/响应,然后利用显示技术(JavaScript、DOM、HTML 和 CSS)处理响应 。如今,使用 AJAX 的应用程序是合法的,因为多数浏览器都支持这项必需的技术 。有关 AJAX 更详细的定义,请访问 AJAX Wikipedia entry(英文) 。

AJAX 到底是什么?AJAX 使您能够通过 JavaScript 调用执行服务器端方法,而不需要刷新浏览器 。将它视为发生于用户后台的小型请求/响应 。如果您仍不清楚 AJAX 是什么,请看 Google 上的两个常见示例:Google Suggests(英文)和 Google Maps(英文) 。如果您不熟悉 AJAX,这两个应用程序的响应会使您有点兴奋 。

返回页首返回页首

用于 ASP.NET 的 AJAX

很多因素促使 AJAX 应运而生 。您可能不想花费几个小时或几天来了解 AJAX 的内部原理,而是更希望现在就开始创建启用了 AJAX 的应用程序,来满足现有需求(如果您确实想知道 AJAX 内部工作原理,我肯定不是可以询问的人) 。开发人员可以用来快速入门的工具有很多 。不过我们将特别关注由 Michael Schwarz 编写的源代码开放的免费 Ajax.NET 。Ajax.NET 考虑到所有的实现细节是基于 .NET 的,并且能够被扩展 。Microsoft ASP.NET 2.0 通过客户端回调功能(英文)引入了独具特色的异步回调,并且最近宣布(英文)代号为“Atlas”的 AJAX 正在实现中 。

术语可能有些混乱,但是当我介绍 AJAX 时,就是在介绍从客户端异步调用服务器端函数的整体框架 。提到 Ajax.NET 时,我是指能够帮助您创建利用 AJAX 框架的解决方案的特定实现 。

要了解有关 ASP.NET 2.0 客户端回调功能的详细信息,请访问 Bertrand Le Roy 的博客(英文) 。

返回页首返回页首

手头的 AJAX

本文的剩余部分将使用 Ajax.NET 着重介绍三个利用 AJAX 功能的有意义的示例 。本指南将包含以 Microsoft C# 和 Microsoft Visual Basic .NET 编写的代码,有时同时提供这两种代码,有时仅提供其中一种代码 。实现所有这一切的代码很容易,C# 开发人员能够很容易地遵循仅以 Visual Basic .NET 编写的代码,反之亦然!本文包含的示例 C# 和 Visual Basic .NET 项目可供下载,并提供工作代码和运行代码 。在学习示例以前,首先需要了解如何安装和使用 Ajax.NET 。

Ajax.NET

AJAX.NET 文档(英文)和网站(英文)对开发人员快速入门非常有用 。在介绍使用此技术的一些具体示例之前,我们将简要回顾您所需要知道的核心步骤 。

首先从 AJAX.NET 项目网站(英文)上下载并解压缩 AJAX 文件,然后按照您的喜好在 Visual Basic .NET 或 C# 中创建新的 ASP.NET 项目,再向 AJAX.dll 文件添加引用(英文) 。唯一的额外配置步骤是在 <system.web> 元素中(位于 web.config 文件中)添加以下代码 。

<configuration>
<system.web>
<httpHandlers>
<!-- Register the ajax handler -->
<add verb="POST,GET" path="ajax/*.ashx"
type="Ajax.PageHandlerFactory, Ajax" />
</httpHandlers>
...
...
</system.web>
</configuration>

为了使服务器端函数在 JavaScript 中可用,必须做两件事情 。首先,要使用的函数必须标有 Ajax.AjaxMethodAttribute 。其次,在页加载事件期间,必须通过调用 Ajax.Utility.RegisterTypeForAjax 来注册包含这些函数的类 。听起来似乎有些复杂,但请不必担心;实际上只需要在代码中多加两行 。让我们看一个示例 。

//C#
public class Sample :System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
//注册我们感兴趣的包含服务器端函数
//的类
Ajax.Utility.RegisterTypeForAjax(typeof(Sample));
}
[Ajax.AjaxMethod()]
public string GetMessageOfTheDay()
{
return "Experience is the mother of wisdom";
}
}
VB.NET
Public Class Sample
Inherits System.Web.UI.Page
Private Sub Page_Load(sender AsObject, e As EventArgs)
Handles MyBase.Load
注册我们感兴趣的包含服务器端函数
的类
Ajax.Utility.RegisterTypeForAjax(GetType(Sample))
End Sub
<Ajax.AjaxMethod()> _
Public Function GetMessageOfTheDay() As String
Return "Experience is the mother of wisdom"
End Function
End Class

以上示例首先告知 Ajax.NET 在 Sample 类中查找友好的 Ajax 方法 。它正好是与实际页相同的类,但是它可以是任意 .NET 类,或可以注册多个类 。然后,Ajax.NET 将浏览指定的类,来查找标有 AjaxMethodAttribute 的所有方法,其中 Sample 类有一个 GetMessageOfTheDay 。

完成后,剩下唯一要做的就是在 JavaScript 中使用它 。Ajax.NET 自动创建与注册的类具有相同名称的 JavaScript 变量(在本例中将为 Sample),它提供与 AjaxMethod 具有相同名称的函数(在本例中为 GetMessageOfTheDay) 。如下所示 。

<script language="javascript">
Sample.GetMessageOfTheDay(GetMessageOfTheDay_CallBack);
function GetMessageOfTheDay_CallBack(response)
{
alert(response.value);
}
</script>

除了 JavaScript 回调函数以外,JavaScript GetMessageOfTheDay 还需要与其服务器端对应部分相同的参数(在此情况下,没有参数),以便在完成时执行并传递响应 。在此,我们看到 AJAX 在工作时的异步特性,因为对 GetMessageOfTheDay 的调用不阻碍执行其他 JavaScript 代码,也不阻碍用户继续在页上进行操作 。完成服务器端处理时,Ajax.NET 调用指定的回调函数 GetMessageOfTheDay_CallBack,并向其传递由服务器端返回值组成的响应 。

服务器端代码和 JavaScript 代码之间的映射可能有些混乱 。图 1 简要显示了服务器端代码和 JavaScript 代码,以及两者之间的映射 。


1:服务器端代码和 JavaScript 代码之间的映射

当然令人感兴趣的 Ajax.NET 还有更多内容值得介绍,例如对 .NET 类型的支持和丰富的回调响应(它不仅仅是值) 。以下示例将会重点介绍某些功能,希望帮助您理解 AJAX 如何帮助您创建成功的应用程序 。

示例 1:链接的下拉列表

本文的开始简要地讨论了用于链接两个 DropDownList 的两种传统方法 。当选定的索引更改时,返回页;或者将所有可能的数据加载到 JavaScript 数组并动态显示 。希望您可以看到 AJAX 如何替代这两种解决方案 。

首先,让我们来看一下我们的数据界面,并从该数据界面驱动示例 。我们的数据访问层将提供两种方法:第一种方法将检索系统支持的国家/地区的列表,第二种方法将获取国家/地区 ID 并返回州/省的列表 。由于这是纯数据访问,因此我们只需要使用方法 。

//C#
public static DataTable GetShippingCountries();
public static DataView GetCountryStates(int countryId);
VB.NET
Public Shared Function GetShippingCountries() As DataTable
Public Shared Function GetCountryStates(ByVal countryId As Integer)
As DataView

现在,让我们转到相反面,创建简单的 Web 窗体 。

<asp:DropDownList ID="countries" Runat="server" />
<asp:DropDownList ID="states" Runat="server" />
<asp:Button ID="submit" Runat="server" Text="Submit" />

Page_Load 事件同样简单,和前述的 Web 窗体一样 。我们使用数据访问层来检索可用的国家/地区,并将其绑定到 countriesDropDownList 中 。

//C#
if (!Page.IsPostBack)
{
countries.DataSource = DAL.GetShippingCountries();
countries.DataTextField = "Country";
countries.DataValueField = "Id";
countries.DataBind();
countries.Items.Insert(0, new ListItem("Please Select", "0"));
}

通常,代码到此为止 。首先,我们将创建要从 JavaScript 调用的服务器端函数 。

VB.NET
<Ajax.AjaxMethod()> _
Public Function GetStates (ByVal countryId As Integer) As DataView
Return DAL.GetCountryStates(countryId)
End Function