传统型ASPNET Web Forms是基于同时包含了表现层和后台代码的Web页面所以紧随其后出现的ASPNET AJAX特别是这个框架的服务器端控件并没有像它们本应该的那样光芒四射于是很多跟随AJAX时髦的ASPNET开发者只是向ASPNET页面中随意地放置一些UpdatePanel控件以便使其程序实现基本的AJAX支持实际上这只是防止了页面的闪烁而根本上页面还是进行了完整的回发并且要经历整个页面的生存周期为了消除ASPNET Web Forms所依赖的页面回寄和ViewState等复杂技术微软又推出了ASPNET应用开发的另一个可选框架—ASPNET MVC也正是基于前面的分析ASPNET MVC中也加入了部分AJAX支持技术但是目前的ASPNET MVC框架尚未发布其正式发行版本在许多方面仍存在不完善的地方尤其是对于AJAX技术仅提供了有限的支持本文中我们将通过一个简单的例子来讨论如何借助于ASPNET MVC Preview 框架提供的AjaxForm方法实现基本的AJAX编程支持
一 引言
如果你详细研究一下ASPNET MVC框架每个版本之间的变化信息有关资源那么你会注意到新版本的框架中提供了一组新对象例如AjaxHelper和AjaxExtensions借助于这些对象你可以为你的ASPNET MVC应用程序添加流行的Ajax支持功能此外借助于客户端JavaScript脚本框架JQuery你也能实现同样的目的而且借助于开源工程MVCContrib似乎你也能够实现同样的Ajax支持
本文中我们针对ASPNET MVC Preview 框架提供的Ajax作一简单的讨论分析其提供的基本的Ajax支持功能
二 实例剖析
(一)创建示例ASPNET MVC工程
启动Visual Studio (我使用的是Team System版本)创建一个新的ASPNET MVC工程并命名为MvcBuiltinAjax(注本实
例中使用的是目前最新的ASPNET MVC Preview 而且在本例中我们并不关心是否加入单元测试支持框架的问题)
(二)修改视图页面Indexaspx
请注意本例中我们直接修改视图页面Indexaspx我们将在此页面中添加一个文本框和一个按钮控件我们的目的是当点击此按钮控件时执行表单提交功能通过此过程我们将回调服务器端并取得相应的字符串而且此字符内容将被以Ajax方式填入到按钮控件旁边的div元素中图展示了实例程序的某一运行时刻的快照图中当我们在文本框中输入字符串张三时后台控制器Action方法查询已有数据串如果其中没有刚刚输入的内容则显示可以使用这个名字!否则显示 此名字已经被使用了!的提示
现在我们来看一下修改视图Indexaspx中涉及的主要内容如下所示
<asp:Content ID=indexContent ContentPlaceHolderID=MainContent runat=server>
<p>
<%using (AjaxForm(ExamineTextBox new AjaxOptions {UpdateTargetId = resultDiv }))
{ %>
<%= HtmlTextBox(textBox)%>
<input type=submit value=Button/>
<span id=resultDiv/>
<% } %>
</p>
</asp:Content>
请注意这里所使用的AjaxForm帮助函数和引用span元素的UpdateTargetID属性的值有关AjaxOptions的用法也有许多值得考察的地方后面再进行讨论
如果你进一步分析一下运行时刻上面视图页面的相应源码那么你会注意到对应于上面内容的如下一段内容
<p>
<form action=/Home/ExamineTextBox onsubmit=SysMvcAsyncFormhandleSubmit(this { insertionMode: updateTargetId: result }); return false;><input type=text name=textBox id=textBox value= />
<input type=submit value=提交/>
<span id=result/>
</form>
</p>
正如你所想像的在前面的编码中我们也完全可以直接使用这里的SysMvcAsyncFormhandleSubmit函数只是上面的形式更为直观且易于使用罢了
(三)添加控制器Action方法
然后我们在Home控制器中添加一个Action方法ExamineTextBox内容如下
public class HomeController : Controller
{
public string ExamineTextBox(string textBox)
{
string[] existingUsers = { ScottGu ScottHa GuyIncognito Boris };
if (existingUsersContains(username))
{
return 此名字已经被使用了!;
}
else
{
return 可以使用这个名字!;
}
}
}
注意这里ExamineTextBox的return方法返回的不是一个ActionResult类型而是一个string事实上这个string返回结果将会被自动打包成一个ContentResult类型因此你也可以直接返回一个ContentResult类型但是上面的编程使得函数格式更为易于理解
另外值得注意的是上面的方法返回的结果是经由AJAX调用实现的之后此结果被悄悄地填入到相应的span标记中通过运行时启动你的任何HTTP拦截工具你会观察到出现类似如下所示的请求(Request)内容
POST /Home/ExamineTextBox HTTP/
Referer:
ContentType: application/xwwwformurlencoded; charset=utf
AcceptEncoding: gzip deflate
Host: localhost:
ContentLength:
Connection: KeepAlive
Pragma: nocache
textBox=dude&__MVCAJAX=true
现在我们来观察一下响应(Response)结果如下所示
HTTP/ OK
Server: ASPNET Development Server/
CacheControl: private
ContentType: text/html; charset=utf
ContentLength:
Connection: Close
三关于脚本文件MicrosoftMvcAjaxdebugjs
还记得前面的表单编码中当调用AjaxForm时出现一个UpdateTargetID吗?它所指向的是按钮控件旁边的div元素(相应于其ID值)其实这个div元素内容的填入方式是通过脚本文件MicrosoftMvcAjaxdebugjs控制实现的
为了进一步弄清楚问题的实质我们还是跟蹤到脚本文件MicrosoftMvcAjaxdebugjs的内容中来看一下相关的代码片断吧如下所示
//把结果插入进目标元素中
if (targetElement) {//如果存在目标元素
switch (insertionMode) {
case SysMvcInsertionModeReplace:
targetElementinnerHTML = executorget_responseData();
break;
case SysMvcInsertionModeInsertBefore:
targetElementinnerHTML = executorget_responseData() + targetElementinnerHTML;
break;
case SysMvcInsertionModeInsertAfter:
targetElementinnerHTML = targetElementinnerHTML + executorget_responseData();
break;
}
}
四把对Ajax脚本的引用添加到母版视图
注意在目前(最新版本的Preview )的ASPNET MVC编程中我们必须手工添加相应的Ajax脚本库在本例中我把它们添加到母版视图SiteMaster下如下所示
<script src=/Content/MicrosoftAjaxdebugjs type=text/javascript></script>
<script src=/Content/MicrosoftMvcAjaxdebugjs type=text/javascript></script>
另外还请注意上面的脚本文件MicrosoftMvcAjaxjs是框架最新提供的它(以及另外几个脚本文件)位于你新建的MVC应用程序的Content文件夹下
五小结
最后请记住本文中的项目是在ASPNET MVC Preview 下编写和编译通过的从进一步分析ASPNET MVC目前提供的几个程序集不难看出其目前提供的Ajax支持支持是非常有限的目前从网上搜集到的有关于ASPNET MVC框架内置的Ajax支持文章也非常罕见作为参考读者不妨再研究一下这篇博客文章
_Panels_with_ASPNET_MVCaspx