95992828九五至尊2

ASP.NET 调味品:AJAX

二月 18th, 2019  |  882828九五至尊手机版

Karl Seguin

原文:
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 AJAX.NET
Microsoft ASP.NET

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

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

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

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

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

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

882828九五至尊手机版 1

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

简介

自打先河 Web 编程以来,在 Web
应用程序和桌面应用程序之间向来留存着众多挑选。例如,人们平时认为 Web
应用程序提供的用户界面类型没有桌面应用程序提供的用户界面类型那样丰盛。另一方面,Web
应用程序是单身的阳台,其付出机制相比不难。提供响应更及时的应用程序看似是一项简单的职务,但对于
Web 开发人士来说却是向来以来需求攻克的园地。

古板意义上,只可以通过向 Web
服务器交由新的乞请来搜寻对用户输入所做的响应。在少数情状下,开发人士可以行使
JavaScript
在客户端上加载全部响应,从而提供更好的用户体验。此技能的大规模示例是依据所选国家/地区来动态加载一连串州或省。遗憾的是,在无数境况下,不将具有响应都回来或加载到
JavaScript 要更好。重返操作会使过多的 UI
断开连接,或在客户端上需要过量的数量,那平日造成生成不易读的
JavaScript。AJAX
提供了一种新的中级选取,可以在维持及时响应和灵活性的同时选择基于服务器的应用程序。

882828九五至尊手机版 2回去页首

简介

从今发轫 Web 编程以来,在 Web
应用程序和桌面应用程序之间直接存在着累累增选。例如,人们一般认为 Web
应用程序提供的用户界面类型没有桌面应用程序提供的用户界面类型那样丰盛。另一方面,Web
应用程序是单身的平台,其支付机制相比较不难。提供响应更及时的应用程序看似是一项简单的义务,但对此
Web 开发人士来说却是一贯以来需求攻克的天地。

古板意义上,只可以通过向 Web
服务器交由新的请求来寻觅对用户输入所做的响应。在少数景况下,开发人士能够运用
JavaScript
在客户端上加载全数响应,从而提供更好的用户体验。此技能的宽广示例是基于所选国家/地区来动态加载一体系州或省。遗憾的是,在重重情景下,不将具备响应都回到或加载到
JavaScript 要更好。再次回到操作会使过多的 UI
断开连接,或在客户端上急需过量的多少,那日常造成生成不易读的
JavaScript。AJAX
提供了一种新的中档采纳,可以在保险及时响应和灵活性的同时使用基于服务器的应用程序。

882828九五至尊手机版 3回到页首

什么是 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
Suggests
(英文)和
Google Maps(英文)。假设您素不相识AJAX,那八个应用程序的响应会使您有点欢悦。

882828九五至尊手机版 4回去页首

什么是 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
Suggests
(英文)和
Google Maps(英文)。如若你不熟习AJAX,那七个应用程序的响应会使您有点欢悦。

882828九五至尊手机版 5回到页首

用于 ASP.NET 的 AJAX

多多成分促使 AJAX 应运而生。您可能不想开支多少个小时或几天来驾驭 AJAX
的内部原理,而是更希望后天就起来创立启用了 AJAX
的应用程序,来满意现有必要(假如您确实想领悟 AJAX
内部工作规律,作者一定不是足以精通的人)。开发人士可以用来飞快入门的工具有过多。但是大家将尤其关切由
迈克尔 Schwarz 编写的源代码开放的免费 Ajax.NET。Ajax.NET
考虑到全数的贯彻细节是基于 .NET 的,并且可以被扩展。Microsoft ASP.NET
2.0
通过客户端回调作用(英文)引入了面目全非的异步回调,并且眼下揭橥(英文)代号为“Atlas”的
AJAX 正在贯彻中。

术语只怕有个别凌乱,然而当自身介绍 AJAX
时,就是在介绍从客户端异步调用服务器端函数的共同体框架。提到 Ajax.NET
时,我是指可以支持你创设利用 AJAX 框架的消除方案的一定完结。

要了解有关 ASP.NET 2.0 客户端回调成效的详细消息,请访问 Bertrand Le
Roy

的博客
(英文)。

882828九五至尊手机版 6归来页首

用于 ASP.NET 的 AJAX

很多元素促使 AJAX 应运而生。您恐怕不想开支多少个小时或几天来打听 AJAX
的中间原理,而是更期望后天就初叶创办启用了 AJAX
的应用程序,来满足现有须要(就算你确实想驾驭 AJAX
内部工作规律,小编肯定不是足以精通的人)。开发人士可以用来飞快入门的工具有很多。不过大家将越发关切由
迈克尔 Schwarz 编写的源代码开放的免费 Ajax.NET。Ajax.NET
考虑到具有的贯彻细节是基于 .NET 的,并且可以被伸张。Microsoft ASP.NET
2.0
通过客户端回调成效(英文)引入了异军突起的异步回调,并且近期发布(英文)代号为“Atlas”的
AJAX 正在完成中。

术语或然某些凌乱,不过当自身介绍 AJAX
时,就是在介绍从客户端异步调用服务器端函数的共同体框架。提到 Ajax.NET
时,笔者是指可以扶助您成立利用 AJAX 框架的消除方案的特定完毕。

要打听关于 ASP.NET 2.0 客户端回调效用的详细消息,请访问 Bertrand Le
Roy

的博客
(英文)。

882828九五至尊手机版 7回来页首

手头的 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.RegisterTypeForAjax882828九五至尊手机版,
来注册包蕴这个函数的类。听起来如同有点复杂,但请不要担心;实际上只须求在代码中多加两行。让大家看一个演示。

//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 在 萨姆ple 类中查找自个儿的 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 代码,以及两者之间的照耀。

882828九五至尊手机版 8

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

那与您日常采纳的其余其他函数一样:它要求我们想要得到的国度/地区的
ID,并将该请求传递给 DAL。唯一的不等是我们已运用 AjaxMethodAttribute
标记了该方法。最终剩余的劳动器端步骤是透过调用 RegisterTypeForAjax
使用 Ajax.NET 来注册包涵上述办法的类(在此情形下,是大家的上边的代码)。

//C#
Ajax.Utility.RegisterTypeForAjax(typeof(Sample));
'VB.NET
Ajax.Utility.RegisterTypeForAjax(GetType(Sample))

大家已基本形成;剩余的就是从 JavaScript 调用 GetStates
方法和处理响应。当用户从国家/地区列表中精选新项时,大家想在逻辑上调用
GetStates。为此,大家将触及 JavaScript onChange
事件。那样就某个更改了我们的 Web 窗体代码。

<asp:DropDownList onChange="LoadStates(this)"
ID="countries" Runat="server" />

JavaScript LoadStates 函数将承受通过由 Ajax.NET
创设的代理发出异步请求。请记住,默许处境下,Ajax.NET 创造的代理的格式为
<RegisteredTypeName>.<ServerSideMethodName>。在大家的言传身教中,将为
Sample.GetStates。大家还想传入国家/地区 ID 参数和成功劳动器端函数后
Ajax.NET 应调用的回调函数。

//JavaScript
function LoadStates(countries)
{
var countryId = countries.options[countries.selectedIndex].value;
Sample.GetStates(countryId, LoadStates_CallBack);
}

最后二个手续是拍卖我们的 LoadStates_CallBack 函数中的响应。Ajax.NET
最有效的职能大约是它援救广大 .NET
类型(作者曾经屡次三番关联那点)。回看一下赶回 DataView
的服务端函数。JavaScript 知道 DataView 什么?什么也不亮堂,可是JavaScript 是面向对象的语言,而且 Ajax.NET 不只可以够创立与 .NET
DataView 相似的指标,还是可以将该函数再次来到的值映射到 JavaScript
副本。您应该记住 JavaScript DataView 只不过是事实上 DataView
的副本,近期除了可以遍历行和访问列值以外不接济其余更加多职能(例如设置
RowFilter 或 Sort 属性的意义)。

function LoadStates_CallBack(response)
{
//如果服务器端代码出现异常
if (response.error != null)
{
//我们应该能做得更好
alert(response.error);
return;
}
var states = response.value;
//如果不是我们所希望的响应
if (states == null || typeof(states) != "object")
{
return;
}
//获得州下拉列表
var statesList = document.getElementById("states");
statesList.options.length = 0; //重置州下拉列表
//记住,其长度不是 JavaScript 中的 Length
for (var i = 0; i < states.length; ++i)
{
//如命名属性一样公开行的列
statesList.options[statesList.options.length] =
new Option(states[i].State, states[i].Id);
}
}

经过一些谬误检查过后,前面的 JavaScript
拿到州下拉列表,遍历响应的值,并动态地将甄选添加到该下拉列表中。代码清晰、简单并与
C# 和 Visual Basic .NET
非常相似。就笔者个人而言(作为基于服务器端变量创设了 JavaScript
数组并将它们链接在协同的开发人士),小编还要一段时间才能相信它的确起功用了。

有多少个或然不太显眼的基本点难题。由于 DropDownList 是在 JavaScript
中动态创设的,因而它的项不属于
ViewState,并且不被爱抚。那代表按钮的 OnClick
事件处理程序须求举行部分非凡的修改。

'VB.NET
Private Sub submit_Click(sender As Object, e As EventArgs)
Dim selectedStateId As String = Request.Form(states.UniqueID)
'应进行一些用户验证...
states.DataSource =
DAL.GetCountryStates(Convert.ToInt32(countries.SelectedIndex))
states.DataTextField = "State"
states.DataValueField = "Id"
states.DataBind()
states.SelectedIndex =
states.Items.IndexOf(states.Items.FindByValue(selectedStateId))
End Sub

第②,大家无法拔取 states.SelectedValue 属性,而必须选择Request.Form。其次,固然大家想向用户重新突显该列表,需求再行利用相同的数码访问方法绑定州
DropDownList。最终,必须以编程格局设置选定的值。

示例 2:文档锁定程序

对此下二个示范,大家将引入越发完整的功力,然后利用 AJAX
立异它。此示例属于简单的文档管理种类。如其余正规的文档管理连串一样,大家亟须提供并发管理。即,大家需求一种方法来拍卖七个用户尝试编辑同三个文档的标题。大家将透过创办某连串型的锁定机制,来使正在编制的文档不只怕再由另二个用户编辑,从而完毕上述目标。我们将拔取AJAX
让用户有更高兴的锁定机制体验。首先,大家将创建用户尝试编辑但无能为力编辑(因为其余用户正在编纂该文档)的文档队列,当这个文档可用时自动公告用户。其次,大家将确保当用户关闭其浏览器或导航到此外地方时,解除对文档的锁定。后二个效果支持确保文档不会永远地处锁定状态。为此,在本指南中,大家将跳过与
AJAX 完结不相干的法力;可是,可下载项目涵盖全部机能。

先是,当用户尝试编辑文档时,大家会尝试对其建立排它锁,要是失败,大家会将此文档添加到用户的连串然后使其回到到主页。对此处的
AJAX
没有啥尤其之处,不过大家将翻开一下代码,以便给出示例须求的上下文。在用于编辑的
PageOnLoad 事件中,添加以下代码。

//C#
if (!Page.IsPostBack)
{
//应验证用户输入
Document document = GetDocument(Request.QueryString["id"]);
//我们拥有此文档,但不能编辑它!
if (!Locker.AcquireLock(document))
{
//让我们将它添加到要查看的用户文档列表
User.CurrentUser.AddDocumentToQueue(document.DocumentId);
Response.Redirect("DocumentList.aspx");
}
//好了,我们拥有此文档,并且可以编辑它
//...
}

要害行的岗位是将文档添加到当下用户的行列中(那会将文档添加到会话中)。接下来,我们将创立用户控件,该控件可以被停放到其余页上,用于当队列文档可用时通报用户。此用户控件将包括2个AJAX 方法以及登记 AJAX 的类所需的代码。

'VB.NET
Private Sub Page_Load(s As Object, e As EventArgs)
Handles MyBase.Load
Ajax.Utility.RegisterTypeForAjax(GetType(UnlockNotifier))
End Sub
'遍历队列文档并检查它们是否可用
<Ajax.AjaxMethod()> _
Public Function GetUnlockedDocuments() As DocumentCollection
'获得属于用户的所有队列文档的 ID
Dim queuedDocument As ArrayList = User.CurrentUser.DocumentQueue
Dim unlocked As DocumentCollection = New DocumentCollection
For Each documentId As Integer In queuedDocumentIds
'如果队列文档不再被锁定
If Not Locker.IsLocked(documentId) Then
unlocked.Add(Document.GetDocumentById(documentId))
End If
Next
Return unlockedDocuments
End Function

今昔急需的是使局地 JavaScript
发出请求并处理响应。大家将根据响应在要动态创造的表中放置已发布的文档消息(假使有)。为此,大家将起来编制
HTML。

<div id="notifyBox" style="display:none;">
<b>The following queued documents can now be edited</b>
<table cellpadding="5" cellspacing="0"
border="0" style="border:1px solid #EEE;"
id="notifyTable">
</table>
</div>

假如没有可用的文档(或是没有为该用户列出文档),大家拔取 DIV
标记隐藏全数内容,用 TABLE
标记来呈现结果。我们将动用轮询系统来检查是或不是留存任何可用的行列文档。一般的话,那象征大家将在稍后一段时间内一贯调用服务器端方法,并突显结果。在加载页面时仅发生第两次调用,每隔
X 秒爆发一连调用。

<script language="javascript">
window.setTimeout("PollQueue();", 2000);
//每隔 2 秒激发以检查在具有许多用户的实际系统中是否发布了
//队列文档,2 秒可能会使服务器承受
//过高的负荷。我们甚至可以首先检查用户是否
//拥有队列,但是我们确实需要进行一些
//性能测试
function PollQueue()
{
//UnlockNotifier 是我们使用 Ajax.NET 注册的类型
//GetUnlockedDocuments 是该类型中的方法,标有
//AjaxMethod 属性
UnlockNotifier.GetUnlockedDocuments(PollQueue_CallBack);
//每隔 2 秒调用其本身
window.setTimeout("PollQueue();", 2000);
}
</script>

剩余的就是处理响应。那与原先示例中的代码相似。首先,检查是或不是留存错误,得到响应,遍历可用的文档,动态创造HTML,在这种意况下,向表中添加行和列。

function PollQueue_CallBack(response)
{
var notifyBox = document.getElementById("notifyBox");
var notifyTable = document.getElementById("notifyTable");
//如果我们无法找到表通知框
if (notifyBox == null || notifyTable == null)
{
return;
}
//如果服务器端代码出现异常
if (response.error != null)
{
notifyBox.style.display = "none";
alert(response.error); //我们应该能做得更好
return;
}
var documents = response.value;
//如果不是我们所希望的响应
if (documents == null || typeof(documents) != "object")
{
notifyBox.style.display = "none";
return;
}
for (var i = 0; i < notifyTable.rows.length; ++i)
{
notifyTable.deleteRow(i);
}
for(var i = 0; i < documents.length; ++i)
{
var row = notifyTable.insertRow(0);
row.className = "Row" + i%2;
var cell = row.insertCell(0);
cell.innerHTML = documents[i].Title;
cell = row.insertCell(1);
var date = documents[i].Created;
cell.innerHTML = date.getDay() + "/" + date.getMonth()
+ "/" + date.getYear();
cell = row.insertCell(2);
cell.innerHTML = "<a href='DocumentEdit.aspx?id="
+ documents[i].DocumentId + "'>edit</a>";
}
notifyBox.style.display = "block";
}

咱俩要来看的末尾贰个飞跃立异是当用户关闭浏览器、导航到其余链接或单击“后退”按钮时,将机关清除文档锁定。常常,可以通过接触
JavaScript OnBeforeUnLoad 事件或 OnUnload
事件达到此目标,那会打开新的小型弹出式窗口,该弹出式窗口在加载页面时做一些清理然后自动关闭。您自个儿能够拔取弹出式窗口,不过其余人则无法使用,它将招致弹出式窗口受阻并使文档永久保持锁定状态。要化解此难题,我们仍急需多少个JavaScript 事件,不过并不是开行弹出式窗口,而是将经过 AJAX
执行服务器端方法。在用于编辑文档的页上(即,放置锁的页),大家添加一些简易的
JavaScript。

<script language="javascript">
//如果用户关闭浏览器或点击“后退”按钮,
//确保该文档会被解除锁定
window.onbeforeunload = ReleaseLock;
function ReleaseLock() {
Locker.ReleaseDocument(<%=DocumentID%>);
}
</script>

在这里,DocumentId
是在背后的代码中定义和安装的变量。此外,大家得以在对话中存储
DocumentId,并在服务器端 ReleaseDocument
中访问。通常,ReleaseDocument 从锁定的文档列表中删除文档。

示例 3:论坛大旨搜索

咱俩要看的末尾二个示范是对现有应用程序的改动。作者首次听到这一个想法是
Josh
Ledgard
(英文)设想在
MSDN
论坛
(英文)里添加1个功用。目标是尝尝协理用户自个儿找到题目的答案,以及限制重复发表的数量。一般的话,用户在论坛中指出新题材时,他或他会输入宗旨和题材。他们常备都不会先举行检索,来查看是不是已经指出和回复过该难点。输入
AJAX。用户输入主旨(并将 Tab
键移出该字段)后,我们依据该核心异步搜索论坛,并适时地向用户显示结果。有时这一个结果会有帮扶,有时候则不会。

为使结果有帮衬,我们将修改 asp.NETPRO Reader’s Choice Award for BestForum Application,
CommunityServer。可下载的示范中不包括这一片段(或论坛)的代码,可是你能在
http://communityserver.org/(英文)学到关于
CommunityServer 的更加多知识,并且可在里头使用下边那几个代码片断。

设置 CommunityServer 并安插 Ajax.NET(已将引用和处理程序添加到
web.config)后,大家只需求开展局地改动就可以拿到所需的效应。首先,大家转到
CommunityServerForums 项目中的 CreateEditPost.cs
文件。将它视为此页的后边的代码,其中用户可以添加新的披露。上边大家将增加启用了
AJAX 的函数。

//C#
[Ajax.AjaxMethod()]
public static ArrayList Search(string search)
{
SearchQuery query = new SearchQuery();
query.PageIndex = 0; //获得前 10 个结果
query.PageSize = 10;
query.UserID = Users.GetUser().UserID;
query.SearchTerms = search;
return new ForumSearch().GetSearchResults(query).Posts;
}

我们可以使用已经在 CommunityServer
中创设的检索效果,只必要大家的函数能采用它。如既往一样,类型必须使用
Ajax.NET 注册。大家将在同等文件的 InitializeSkin 函数(将其身为
Page_Load)中进行此操作。

//C#
Ajax.Utility.RegisterTypeForAjax(typeof(CreateEditPost));

在转跳到 JavaScript 从前,大家必要开展最后的服务器端更改。重临到
Ajax.NET 的自定义类(例如大家正在再次来到的 ArrayList 所含有的
ForumPost)必须标有 Serializable 属性。我们要做的是转到
CommunityServerForums 项目中的 Components/ForumPost.cs
文件,并添加此属性。

//C#
[Serializable]
public class ForumPost :Post
{
...
}

显示时,我们仅必要修改 CommunityServerWeb 项目中的
Themes/default/Skins/View-EditCreatePost.cs。首先,大家将触及核心文本框的
onBlur 事件。

<asp:textbox onBlur="Search(this.value);"
id="PostSubject" runat="server" ... />

接着,大家编辑 JavaScript Search 方法,以便调用服务器端 Search

var oldValue = '';
function Search(value)
{
//不要再次搜索刚搜索过的内容
//如果用户向后或向前移动 Tab 键将会发生
if (value != oldValue)
{
CreateEditPost.Search(value, Search_CallBack);
oldValue = value;
}
}

最后,剩下的就是处理响应。由于上1个演示介绍了在表中突显结果的有点正规的法门,大家将唯有创立一些动态的
HTML,并将它粘贴到虚拟的 DIV 中。

function Search_CallBack(response)
{
//由于没有结果时搜索功能将自动重定向,
//因此,我们不能使用 response.error。
var results = response.value;
//如果我们没有获得结果
if (results == null)
{
return;
}
//我们用于放置结果的 DIV
var someDiv = document.getElementById("someDiv");
var html = "";
for (var i = 0; i < results.length; ++i)
{
var result = results[i];
html += "<a target=_blank href='" + result.PostID
html += "/ShowPost.aspx'>";
html += result.Subject;
html += "</a><br />"
}
someDiv.innerHTML = html;
}

通过对 CommunityServer 应用程序的多个公文(加上用于配置的
web.config)稍微举行修改,大家得以添加一些那么些有效的效能。然而,只向现有的应用程序添加启用
AJAX 作用时要小心操作。正在拓展实际搜索的预先存在的 ForumSearch
类可能并不是为我们介绍的利用项目设计的。我们的代码很或然会导致执行一些格外的物色,影响可能会很显然。

882828九五至尊手机版 9回到页首

手头的 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 的保有办法,其中 萨姆ple 类有多个
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 代码,以及两者之间的投射。

882828九五至尊手机版 10

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

那与你平时使用的别样其余函数一样:它需求大家想要得到的国度/地区的
ID,并将该请求传递给 DAL。唯一的不比是我们已运用 AjaxMethodAttribute
标记了该格局。最终剩余的劳动器端步骤是经过调用 RegisterTypeForAjax
使用 Ajax.NET 来注册包蕴上述措施的类(在此情景下,是我们的底下的代码)。

//C#
Ajax.Utility.RegisterTypeForAjax(typeof(Sample));
'VB.NET
Ajax.Utility.RegisterTypeForAjax(GetType(Sample))

我们已基本到位;剩余的就是从 JavaScript 调用 GetStates
方法和拍卖响应。当用户从国家/地区列表中甄选新项时,我们想在逻辑上调用
GetStates。为此,大家将触发 JavaScript onChange
事件。那样就多少更改了我们的 Web 窗体代码。

<asp:DropDownList onChange="LoadStates(this)" 
ID="countries" Runat="server" />

JavaScript LoadStates 函数将承受通过由 Ajax.NET
创设的代办发出异步请求。请牢记,默许景况下,Ajax.NET 成立的代理的格式为
<RegisteredTypeName>.<ServerSideMethodName>。在我们的演示中,将为
Sample.GetStates。大家还想传入国家/地区 ID 参数和成就劳动器端函数后
Ajax.NET 应调用的回调函数。

//JavaScript
function LoadStates(countries)
{
var countryId = countries.options[countries.selectedIndex].value;
Sample.GetStates(countryId, LoadStates_CallBack);
}

终极三个手续是处理大家的 LoadStates_CallBack 函数中的响应。Ajax.NET
最管用的功用大约是它辅助广大 .NET
类型(作者早就多次提到那或多或少)。回想一下重临 DataView
的服务端函数。JavaScript 知道 DataView 什么?什么也不通晓,然则JavaScript 是面向对象的语言,而且 Ajax.NET 不只好够创建与 .NET
DataView 相似的目的,还是能将该函数重回的值映射到 JavaScript
副本。您应该记住 JavaScript DataView 只可是是事实上 DataView
的副本,近来除了可以遍历行和走访列值以外不辅助其他更多职能(例如设置
RowFilter 或 Sort 属性的功用)。

function LoadStates_CallBack(response)
{
//如果服务器端代码出现异常
if (response.error != null)
 {
//我们应该能做得更好
alert(response.error); 
return;
 }
var states = response.value;
//如果不是我们所希望的响应
if (states == null || typeof(states) != "object")
 {
return;
 }
//获得州下拉列表
var statesList = document.getElementById("states");
statesList.options.length = 0; //重置州下拉列表
//记住,其长度不是 JavaScript 中的 Length
for (var i = 0; i < states.length; ++i)
 {
//如命名属性一样公开行的列
statesList.options[statesList.options.length] =
new Option(states[i].State, states[i].Id);
 }
}

经过一些荒唐检查之后,前边的 JavaScript
得到州下拉列表,遍历响应的值,并动态地将挑选添加到该下拉列表中。代码清晰、不难并与
C# 和 Visual Basic .NET
分外相像。就本身个人而言(作为基于服务器端变量创造了 JavaScript
数组并将它们链接在协同的开发人士),作者还要一段时间才能相信它确实起效用了。

有三个只怕不太分明的要紧难点。由于 DropDownList 是在 JavaScript
中动态创设的,因而它的项不属于
ViewState,并且不被保安。那意味按钮的 OnClick
事件处理程序须求开展一些附加的修改。

'VB.NET
Private Sub submit_Click(sender As Object, e As EventArgs)
Dim selectedStateId As String = Request.Form(states.UniqueID)
'应进行一些用户验证...
states.DataSource =
DAL.GetCountryStates(Convert.ToInt32(countries.SelectedIndex))
states.DataTextField = "State"
states.DataValueField = "Id"
states.DataBind()
states.SelectedIndex = 
states.Items.IndexOf(states.Items.FindByValue(selectedStateId))
End Sub

第贰,大家不可以动用 states.SelectedValue 属性,而必须选取Request.Form。其次,假若大家想向用户重新突显该列表,须要再行利用同一的多少访问方法绑定州
DropDownList。最终,必须以编程格局设置选定的值。

示例 2:文档锁定程序

对此下3个示范,我们将引入特别完整的作用,然后采取 AJAX
革新它。此示例属于简单的文档管理连串。如其余正式的文档管理种类一样,大家务必提供并发管理。即,我们须求一种格局来拍卖五个用户尝试编辑同三个文档的题材。大家将透过创办某种类型的锁定机制,来使正在编辑的文档不能再由另三个用户编辑,从而已毕上述目标。大家将利用
AJAX
让用户有更愉悦的锁定机制体验。首先,大家将成立用户尝试编辑但无能为力编辑(因为其余用户正在编写该文档)的文档队列,当那个文档可用时自动文告用户。其次,我们将保险当用户关闭其浏览器或导航到此外岗位时,解除对文档的锁定。后多个效果辅助确保文档不会永远地处锁定状态。为此,在本指南中,我们将跳过与
AJAX 达成不相干的效益;但是,可下载项目包括全部作用。

第三,当用户尝试编辑文档时,大家会尝试对其建立排它锁,若是失利,我们会将此文档添加到用户的队列然后使其回到到主页。对那里的
AJAX
没有怎么特别之处,不过我们将翻开一下代码,以便给出示例须求的上下文。在用于编辑的
PageOnLoad 事件中,添加以下代码。

//C#
if (!Page.IsPostBack)
{
//应验证用户输入
Document document = GetDocument(Request.QueryString["id"]);
//我们拥有此文档,但不能编辑它!
if (!Locker.AcquireLock(document))
 {
//让我们将它添加到要查看的用户文档列表
User.CurrentUser.AddDocumentToQueue(document.DocumentId);
Response.Redirect("DocumentList.aspx");
 }
//好了,我们拥有此文档,并且可以编辑它
 //...
}

第二行的地点是将文档添加到当前用户的体系中(那会将文档添加到会话中)。接下来,大家将开创用户控件,该控件可以被停放到别的页上,用于当队列文档可用时通报用户。此用户控件将包括1个AJAX 方法以及注册 AJAX 的类所需的代码。

'VB.NET
Private Sub Page_Load(s As Object, e As EventArgs) 
Handles MyBase.Load
Ajax.Utility.RegisterTypeForAjax(GetType(UnlockNotifier))
End Sub
'遍历队列文档并检查它们是否可用
<Ajax.AjaxMethod()> _
Public Function GetUnlockedDocuments() As DocumentCollection
'获得属于用户的所有队列文档的 ID
Dim queuedDocument As ArrayList = User.CurrentUser.DocumentQueue
Dim unlocked As DocumentCollection = New DocumentCollection
For Each documentId As Integer In queuedDocumentIds
'如果队列文档不再被锁定
If Not Locker.IsLocked(documentId) Then
unlocked.Add(Document.GetDocumentById(documentId))
End If
Next
Return unlockedDocuments
End Function

后天急需的是使部分 JavaScript
发出请求并拍卖响应。大家将依照响应在要动态创立的表中放置已公布的文档信息(若是有)。为此,大家将早先编制
HTML。

<div id="notifyBox" style="display:none;">
<b>The following queued documents can now be edited</b>
<table cellpadding="5" cellspacing="0"
border="0" style="border:1px solid #EEE;"
id="notifyTable">
</table>
</div>

即便没有可用的文档(或是没有为该用户列出文档),我们运用 DIV
标记隐藏全部内容,用 TABLE
标记来彰显结果。大家将利用轮询系统来检查是或不是留存任何可用的行列文档。一般的话,那意味大家将在稍后一段时间内间接调用服务器端方法,并显示结果。在加载页面时仅爆发第①遍调用,每隔
X 秒爆发接二连三调用。

<script language="javascript">
window.setTimeout("PollQueue();", 2000);
//每隔 2 秒激发以检查在具有许多用户的实际系统中是否发布了
//队列文档,2 秒可能会使服务器承受
//过高的负荷。我们甚至可以首先检查用户是否
//拥有队列,但是我们确实需要进行一些
//性能测试
function PollQueue()
{
//UnlockNotifier 是我们使用 Ajax.NET 注册的类型
//GetUnlockedDocuments 是该类型中的方法,标有
//AjaxMethod 属性
UnlockNotifier.GetUnlockedDocuments(PollQueue_CallBack);
//每隔 2 秒调用其本身
window.setTimeout("PollQueue();", 2000);
}
</script>

余下的就是拍卖响应。那与从前示例中的代码相似。首先,检查是或不是存在不当,拿到响应,遍历可用的文档,动态成立HTML,在那种气象下,向表中添加行和列。

function PollQueue_CallBack(response)
{
var notifyBox = document.getElementById("notifyBox");
var notifyTable = document.getElementById("notifyTable");
//如果我们无法找到表通知框
if (notifyBox == null || notifyTable == null)
  {
return;
  }
//如果服务器端代码出现异常
if (response.error != null)
  { 
notifyBox.style.display = "none"; 
alert(response.error); //我们应该能做得更好
return;
  }  
var documents = response.value;
//如果不是我们所希望的响应
if (documents == null || typeof(documents) != "object")
  {
notifyBox.style.display = "none";
return;
  }  
for (var i = 0; i < notifyTable.rows.length; ++i)
  {
notifyTable.deleteRow(i);
  }
for(var i = 0; i < documents.length; ++i)
  {    
var row = notifyTable.insertRow(0);
row.className = "Row" + i%2;
var cell = row.insertCell(0);
cell.innerHTML = documents[i].Title;
cell = row.insertCell(1);
var date = documents[i].Created;
cell.innerHTML = date.getDay() + "/" + date.getMonth() 
+ "/" + date.getYear();
cell = row.insertCell(2);
cell.innerHTML = "<a href='DocumentEdit.aspx?id=" 
+ documents[i].DocumentId + "'>edit</a>";
  } 
notifyBox.style.display = "block";
}

咱俩要看看的最终2个火速创新是当用户关闭浏览器、导航到别的链接或单击“后退”按钮时,将自动清除文档锁定。平日,可以通过接触
JavaScript OnBeforeUnLoad 事件或 OnUnload
事件达到此目标,那会打开新的小型弹出式窗口,该弹出式窗口在加载页面时做一些清理然后自行关闭。您自身可以运用弹出式窗口,不过其余人则无法利用,它将促成弹出式窗口受阻并使文档永久保持锁定状态。要解决此题材,大家仍亟需三个JavaScript 事件,可是并不是运维弹出式窗口,而是将透过 AJAX
执行服务器端方法。在用来编辑文档的页上(即,放置锁的页),我们添加一些简练的
JavaScript。

<script language="javascript">
//如果用户关闭浏览器或点击“后退”按钮,
//确保该文档会被解除锁定
window.onbeforeunload = ReleaseLock;
function ReleaseLock() {
Locker.ReleaseDocument(<%=DocumentID%>);
}
</script>

在这里,DocumentId
是在后头的代码中定义和安装的变量。其余,大家能够在对话中储存
DocumentId,并在服务器端 ReleaseDocument
中访问。通常,ReleaseDocument 从锁定的文档列表中删除文档。

示例 3:论坛核心搜索

小编们要看的末段3个示范是对现有应用程序的改动。我第四回听到那些想法是
Josh
Ledgard
(英文)设想在
MSDN
论坛
(英文)里添加几个效应。目标是尝尝协理用户自身找到标题标答案,以及限制重复发布的数量。一般的话,用户在论坛中指出新题材时,他或她会输入宗旨和难点。他们平日都不会先举行查找,来查看是还是不是已经指出和回复过该难题。输入
AJAX。用户输入主旨(并将 Tab
键移出该字段)后,我们依据该核心异步搜索论坛,并适时地向用户体现结果。有时那一个结果会有救助,有时候则不会。

为使结果有支持,大家将修改 asp.NETPRO Reader’s Choice Award for BestForum Application,
CommunityServer。可下载的演示中不分包这一有的(或论坛)的代码,可是你能在
http://communityserver.org/(英文)学到关于
CommunityServer 的越来越多学问,并且可在其间使用下边那些代码片断。

设置 CommunityServer 并布置 Ajax.NET(已将引用和处理程序添加到
web.config)后,大家只必要展开部分变动就可以博得所需的作用。首先,大家转到
CommunityServerForums 项目中的 CreateEditPost.cs
文件。将它视为此页的末尾的代码,其中用户可以添加新的发表。上边大家将拉长启用了
AJAX 的函数。

//C#
[Ajax.AjaxMethod()]
public static ArrayList Search(string search)
{
SearchQuery query = new SearchQuery();
query.PageIndex = 0; //获得前 10 个结果
query.PageSize = 10;
query.UserID = Users.GetUser().UserID;
query.SearchTerms = search;
return new ForumSearch().GetSearchResults(query).Posts;
}

我们能够利用已经在 CommunityServer
中开创的探寻效果,只须要大家的函数能采用它。如往昔一致,类型必须使用
Ajax.NET 注册。我们将在同等文件的 InitializeSkin 函数(将其就是
Page_Load)中展开此操作。

//C#
Ajax.Utility.RegisterTypeForAjax(typeof(CreateEditPost));

在转跳到 JavaScript 以前,大家要求开展最终的服务器端更改。再次回到到
Ajax.NET 的自定义类(例如大家正在再次回到的 ArrayList 所蕴藏的
ForumPost)必须标有 Serializable 属性。我们要做的是转到
CommunityServerForums 项目中的 Components/ForumPost.cs
文件,并添加此属性。

//C#
[Serializable]
public class ForumPost :Post
{
 ...
}

显示时,大家仅要求修改 CommunityServerWeb 项目中的
Themes/default/Skins/View-EditCreatePost.cs。首先,我们将触及宗旨文本框的
onBlur 事件。

<asp:textbox onBlur="Search(this.value);"
id="PostSubject" runat="server" ... />

随即,我们编辑 JavaScript Search 方法,以便调用服务器端 Search

var oldValue = '';
function Search(value)
{ 
//不要再次搜索刚搜索过的内容
//如果用户向后或向前移动 Tab 键将会发生
if (value != oldValue)
  {
CreateEditPost.Search(value, Search_CallBack);
oldValue = value;
  }
}

末尾,剩下的就是拍卖响应。由于上一个演示介绍了在表中显得结果的有个别正规的主意,我们将单纯创造一些动态的
HTML,并将它粘贴到虚拟的 DIV 中。

function Search_CallBack(response)
{
//由于没有结果时搜索功能将自动重定向,
//因此,我们不能使用 response.error。
var results = response.value;
//如果我们没有获得结果
if (results == null)
 {
return;
 }
//我们用于放置结果的 DIV
var someDiv = document.getElementById("someDiv");
var html = "";
for (var i = 0; i < results.length; ++i)
 {
var result = results[i];
html += "<a target=_blank href='" + result.PostID
html += "/ShowPost.aspx'>";   
html += result.Subject;
html += "</a><br />"
 }
someDiv.innerHTML = html;
}

透过对 CommunityServer 应用程序的多个文本(加上用于配置的
web.config)稍微进行修改,大家可以拉长一些非凡实用的法力。可是,只向现有的应用程序添加启用
AJAX 成效时要小心操作。正在拓展实际搜索的预先存在的 ForumSearch
类只怕并不是为大家介绍的行使项目设计的。我们的代码很大概会导致执行一些附加的查找,影响或许会很鲜明。

882828九五至尊手机版 11归来页首

AJAX 与您

AJAX
怎样以及何地适合您的应用程序,以及是或不是已经存在要基于意况而定。即便大家早已见到使用
Ajax.NET 可以轻松地创立启用 AJAX
的化解方案,但还留存有的其它的注意事项。多少个亟需重点关切的难题是对您的应用程序的完好系统布局和可维护性的熏陶。AJAX
会进一步搅乱系统的各层之间的底限,显明影响突显层、展现逻辑层和业务层。那不是
AJAX
本人的难点,而是使用格局的题材。只要您知道它很简单导致各层之间的有个别争执,并适用操作,就不会爆发难题。

动用 AJAX 的应用程序更难于爱惜吗?答案主要取决于你已经接纳的 JavaScript
的数码,以及你社团和掩护它的三六九等程度。很多开发人士认为 JavaScript
难于编写、测试和调剂(不是因为 JavaScript
本人,而是因为工具协理和开发人士的学问)。若是你当前正在利用 JavaScript
达成链接的下拉列表,并切换成 AJAX,您的代码可能较为不难保障(Ajax.NET 对
.NET
类型和数组的接济是器重原由)。可是,如果您使用重回格局来促成,以后您将向您的运用程序
(JavaScript) 引入崭新的言语。您将必须处理那样的事态:存在一些不加入
ViewState 的数码(那一点我们在按钮单击事件中得以看来)。

另3个亟待考虑的是 AJAX 对您的网站可用性的震慑。虽然 AJAX
最终能成立响应更及时的界面,开发人员仍亟需注意两件事情。首先,很醒目
AJAX 珍重 JavaScript。大家都知情有个别用户禁用
JavaScript,一些标准(例如加拿大政坛 Common Look and Feel [考虑加拿大的
508])须要网站使用 JavaScript
来运营,或不应用它来运作。因而,您不应假定 AJAX 功效正在运营。如果 AJAX
功效不可用,则应使您的应用程序退回到更常见的 Web 处理。其次,AJAX
应用程序可能不纯熟(固然它装有较高级别)用户习惯使用应用程序的措施。例如,通过
AJAX
执行不一样成效的页大概不以用户觉得的格局突显“后退”按钮、“收藏夹”菜单和任何浏览器功能。

882828九五至尊手机版 12回去页首

AJAX 与您

AJAX
怎样以及哪个地方适合你的应用程序,以及是不是早已存在要依照气象而定。就算大家曾经观看采用Ajax.NET 可以轻松地创制启用 AJAX
的缓解方案,但还设有部分其余的注意事项。二个索要重视关怀的标题是对你的应用程序的总种类统布局和可维护性的影响。AJAX
会进一步搅乱系统的各层之间的界限,分明影响突显层、突显逻辑层和业务层。那不是
AJAX
本人的标题,而是采用办法的标题。只要你精晓它很不难造成各层之间的一点争论,并适度操作,就不会发出难点。

使用 AJAX 的应用程序更难于维护吗?答案紧要在于你曾经接纳的 JavaScript
的多少,以及你社团和爱慕它的高低程度。很多开发人员认为 JavaScript
难于编写、测试和调剂(不是因为 JavaScript
自身,而是因为工具辅助和开发人士的学问)。如若您当前正在使用 JavaScript
达成链接的下拉列表,并切换来 AJAX,您的代码大概比较不难保险(Ajax.NET 对
.NET
类型和数组的支撑是根本原因)。但是,如若您使用再次来到情势来贯彻,将来你将向您的应用程序
(JavaScript) 引入崭新的语言。您将必须处理那样的意况:存在有个别不插足
ViewState 的数据(这点我们在按钮单击事件中得以看出)。

另一个须要考虑的是 AJAX 对您的网站可用性的熏陶。即便 AJAX
最后能创设响应更及时的界面,开发人士仍须求小心两件业务。首先,很举世瞩目AJAX 依赖 JavaScript。大家都清楚某个用户禁用
JavaScript,一些正规(例如加拿大政坛 Common Look and Feel [考虑加拿大的
508])要求网站采用 JavaScript
来运行,或不使用它来运转。由此,您不应假定 AJAX 作用正在运作。假设 AJAX
功用不可用,则应使你的应用程序退回到更常见的 Web 处理。其次,AJAX
应用程序只怕不熟悉(就算它具备较高级别)用户习惯使用应用程序的不二法门。例如,通过
AJAX
执行不一成效的页只怕不以用户认为的方法展现“后退”按钮、“收藏夹”菜单和其他浏览器作用。

882828九五至尊手机版 13回到页首

结论

AJAX 不只是令人兴奋的即将出现的技巧,它是具体的框架,在建立 Web
应用程序时得以使用它来消除每一天遭受的难点。Ajax.NET 使 ASP.NET
开发人员轻松明白AJAX。大家来看的七个示范和可下载的档次方可扶助您精通什么利用 AJAX 和
Ajax.NET。您仍可以选拔那一个示例来尝试一些和谐的想法。AJAX
不仅可以创设简洁和强大的应用程序,它还能够使你进步客户满意度和竞争优势。正在议论的
Atlas
的片段高等概念或许鲜明改正大家提供的成品。就个人而言,笔者见过的特等的
AJAX
达成充足轻便合适。您自身的兑现应为您的用户提供平等积极的感受。不过,对于有个别具体难点,记住
AJAX 可能不是唯一的化解方案,也可能不是最佳的缓解方案。以往,让大家作证
ASP.NET 社区是典型的,让大家收拾屋子吧。

有关小编

Karl Seguin 将他的大部时日用在 Microsoft ASP.NET
信息组,支持任何开发人员并摸索和编辑接济性的大旨。当她不坐班或不提供协助时,他喜好无情地清洁
Gnomish 悲惨的 Azeroth。

转到原英文页面

结论

AJAX 不只是令人欢悦的就要出现的技术,它是实际的框架,在建立 Web
应用程序时得以动用它来解决每一日遭逢的难点。Ajax.NET 使 ASP.NET
开发人士轻松通晓AJAX。我们来看的多少个示范和可下载的档次方可扶持你领会哪些使用 AJAX 和
Ajax.NET。您还可以运用这一个示例来尝试一些要好的想法。AJAX
不仅可以创造简洁和强有力的应用程序,它还足以使你提升客户满足度和竞争优势。正在探讨的
Atlas
的有个别高档概念大概鲜明改良大家提供的制品。就个人而言,作者见过的特等的
AJAX
完毕丰裕轻便合适。您自个儿的贯彻应为您的用户提供平等积极的体会。可是,对于某些具体难题,记住
AJAX 只怕不是绝无仅有的化解方案,也大概不是一流的化解方案。未来,让咱们证实
ASP.NET 社区是特出的,让我们收拾房间吧。

关于笔者

Karl Seguin 将她的绝大多数时刻用在 Microsoft ASP.NET
新闻组,协助其余开发人士并招来和编辑辅助性的主旨。当她不做事或不提供救助时,他欣赏凶横地清洁
Gnomish 患难的 Azeroth。

原文:http://www.microsoft.com/china/msdn/library/webservices/asp.net/ASPNetSpicedAjax.mspx

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图