传统型ASP.NET Web Forms是基于同时包含了表现层和后台代码的Web页面, 所以,紧随其后出现的ASP.NET AJAX,特别是这个框架的服务器端控件并没有像 它们本应该的那样光芒四射。于是,很多跟随AJAX时髦的ASP.NET开发者只是向 ASP.NET页面中随意地放置一些UpdatePanel控件以便使其程序实现基本的AJAX支 持。实际上,这只是防止了页面的“闪烁”,而根本上页面还是进行 了完整的回发,并且要经历整个页面的生存周期。为了消除ASP.NET Web Forms 所依赖的页面回寄和ViewState等复杂技术,微软又推出了ASP.NET应用开发的另 一个可选框架—ASP.NET MVC。也正是基于前面的分析,ASP.NET MVC中也 加入了部分AJAX支持技术。但是,目前的ASP.NET MVC框架尚未发布其正式发行 版本,在许多方面仍存在不完善的地方,尤其是对于AJAX技术仅提供了有限的支 持。本文中,我们将通过一个简单的例子来讨论如何借助于ASP.NET MVC Preview 4框架提供的Ajax.Form方法实现基本的AJAX编程支持。
一、引 言
如果你详细研究一下ASP.NET MVC框架每个版本之间的变化信息有关资 源,那么你会注意到新版本的框架中提供了一组新对象,例如AjaxHelper和 AjaxExtensions。借助于这些对象,你可以为你的ASP.NET MVC应用程序添加流 行的Ajax支持功能。此外,借助于客户端JavaScript脚本框架JQuery你也能实现 同样的目的,而且借助于开源工程 MVCContrib似乎你也能够实现同样的Ajax支 持。
本文中,我们针对ASP.NET MVC Preview 4框架提供的Ajax作一简单 的讨论,分析其提供的基本的Ajax支持功能。
二、实例剖析
(一 )创建示例ASP.NET MVC工程
启动Visual Studio 2008(我使用的是Team System版本)创建一个新的ASP.NET MVC工程,并命名为MvcBuiltinAjax(注: 本实例中使用的是目前最新的ASP.NET MVC Preview 4;而且在本例中我们并不 关心是否加入单元测试支持框架的问题)。
(二)修改视图页面 Index.aspx
请注意,本例中我们直接修改视图页面Index.aspx。我们将 在此页面中添加一个文本框和一个按钮控件。我们的目的是,当点击此按钮控件 时,执行表单提交功能。通过此过程,我们将回调服务器端并取得相应的字符串 ,而且此字符内容将被以Ajax方式填入到按钮控件旁边的div元素中。图1展示了 实例程序的某一运行时刻的快照。图中,当我们在文本框中输入字符串“ 张三”时,后台控制器Action方法查询已有数据串,如果其中没有刚刚输 入的内容,则显示“ 可以使用这个名字!”;否则,显示 “ 此名字已经被使用了!”的提示。
现在,我们来看一下修改视图 Index.aspx中涉及的主要内容,如下所示:
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server" >
<p>
<%using (Ajax.Form ("ExamineTextBox", new AjaxOptions {UpdateTargetId = "resultDiv" }))
{ %>
<%= Html.TextBox("textBox1")%>
<input type="submit" value="Button"/>
<span id="resultDiv"/>
<% } %>
</p>
</asp:Content>
请注意这里所使用的Ajax.Form帮助函数和 引用span元素的UpdateTargetID属性的值。有关AjaxOptions的用法也有许多值 得考察的地方,后面再进行讨论。
如果你进一步分析一下运行时刻上面 视图页面的相应源码,那么,你会注意到对应于上面内容的如下一段内容:
<p>
<form action="/Home/ExamineTextBox" onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, { insertionMode: 0, updateTargetId: 'result' }); return false;"><input type="text" name="textBox1" id="textBox1" value="" />
< input type="submit" value="提交"/>
<span id="result"/>
</form>
< /p>
正如你所想像的,在前面的编码中,我们也完全可以直接使用这 里的Sys.Mvc.AsyncForm.handleSubmit函数,只是上面的形式更为直观且易于使 用罢了。