[转载]Ajax为主的应用不需要ASP.NET MVC – dudu – 博客园.
博客园在开发中至今还未使用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是趋势。