Ajax为主的应用不需要ASP.NET MVC
更新:这是一个错误的观点,详情请看事实证明Ajax的世界更需要ASP.NET MVC。
博客园在开发中至今还未使用ASP.NET MVC,似乎有点跟不上时代了,但是否采用一项技术,关键的是这个技术是否能真正解决实际问题。
这篇文章将以我们正在开发的博客园新版站内短消息功能为例,说明一下不需要ASP.NET MVC的理由。
功能简介:短消息收件箱,显示当前用户短消息列表。
用到的主要技术:Master Page, jQuery, jQuery插件Templates, WCF。
Templates是由微软开发的jQuery插件,功能类似于ASP.NET的Repeater控件,Templates将被整合进jQuery 1.5成为核心组件。想更多了解Templates,推荐阅读Microsoft and jQuery。
主要代码:
1. ASP.NET页面文件:
<%@ Page Title="" Language="C#" MasterPageFile="msg.master" %>
<asp:Content ID="ContentMain" ContentPlaceHolderID="cphMain" Runat="Server">
<div id="msg_list">
</div>
<script id="contentTmpl" type="text/x-jquery-tmpl">
<div class="msg_item">
<div class="msg_sender">${SenderName}</div>
<div class="msg_title">${Subject}</div>
<div class="msg_sendtime">${SendTime}</div>
</div>
</script>
<script type="text/javascript">
GetMsgList(1, 30);
</script>
</asp:Content>
上面的代码通过GetMsgList方法a调用WCF获取短消息列表,然后显示在msg_list中。
这里用Master Page是为了重用HTML的公用元素,不然,只要一个html文件就够了,.aspx都不需要,为什么还要用ASP.NET MVC?对于这样的ajax应用,只要加载一个简单的html页面,接下来就交给js了,就是需要MVC,也是在js中进行,ASP.NET MVC无用武之处。
不用ASP.NET MVC,这一个理由足矣。
为了完整地介绍这个示例,继续我们的代码。
2. js代码:
a) js文件引用
<script type="text/javascript" src="http://common.cnblogs.com/script/jquery.js"></script>
<script type="text/javascript" src="http://common.cnblogs.com/script/json2.js"></script>
<script type="text/javascript" src="js/jquery.tmpl.min.js"></script>
<script type="text/javascript" src="js/msg.js"></script>
json2.js是用于将js对象转换为json。
jquery.tmpl.min.js是jQuery插件Templates的引用文件。
msg.js中定义了GetMsgList方法。
b) GetMsgList方法定义:
function GetMsgList(pageIndex, pageSize) {
var msgQuery = {}
msgQuery.PageIndex = pageIndex;
msgQuery.PageSize = pageSize;
$.ajaxSettings.type = 'post';
$.ajaxSettings.dataType = 'json';
$.ajaxSettings.contentType = 'application/json';
$.ajaxSettings.url = '/services/AjaxMsgService.svc/GetMsgList';
$.ajaxSettings.data = '{"msgQuery":' + JSON.stringify(msgQuery) + '}';
$.ajaxSettings.success = function (data) {
$("#contentTmpl").tmpl(data.d).appendTo("#msg_list");
};
$.ajax();
}
“/services/AjaxMsgService.svc”——调用的WCF服务,jQuery如何调用WCF请参考抛弃WebService,在.NET4中用 jQuery 调用 WCF。
“JSON.stringify(msgQuery)”——将msgQuery对象转换为json,WCF中对应的方法是“GetMsgList(SiteMsgQuery msgQuery)”,达到的效果是将js对象作为参数传给了WCF方法。在之前文章的评论中有人说jQuery调用.ashx更方便,从这里的效果看,我觉得jQuery调用WCF(或.asmx)更方便。
$("#contentTmpl").tmpl(data.d).appendTo("#msg_list");——将WCF返回的数据绑定至contentTmpl(见代码一)形成列表,并加载至msg_list,完成数据的显示。这就是Templates插件的作用。
3. WCF代码:
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
public class AjaxMsgService
{
[OperationContract]
public SiteMsg[] GetMsgList(SiteMsgQuery msgQuery)
{
int spaceUserId = Util.GetCurrentUser(HttpContext.Current).SpaceUserID;
msgQuery.SiteMsg = new SiteMsg() { RecipientSpaceUserId = spaceUserId };
//调用后台的WCF服务
MsgServiceClient client = new MsgServiceClient();
SiteMsg[] siteMsgList = client.GetMsgList(msgQuery);
try { client.Close(); }
catch { client.Abort(); }
return siteMsgList;
}
}
这里的WCF相当于一个中转站,它又去调用后台另外一台服务器上的WCF服务,获取短消息数据,以json格式返回给客户端js。
示例介绍完毕,不足之处欢迎大家指出。
总结
随着越来越多的Web应用使用Ajax,ASP.NET MVC施展身手的空间越来越小。
现在唯一阻碍Ajax使用的是搜索引擎不能索引Ajax加载的内容,但这个情况一定会改观,Ajax是趋势,Web App是趋势。