|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
今天去面试,被问到C#中的new关键字,看了那么多的书对new关键字还是有一定认识,回来又把new复习了一遍,发现了许多以前还不知道的细节。真正走进ASP.NETMVC的天下,才晓得它的出色。
“丢弃WebService,在.NET4顶用jQuery挪用WCF”——本来丢弃WebService以后,还能够用jQuery挪用ASP.NETMVC的Controller。
“Ajax为主的使用不必要ASP.NETMVC”,本来Ajax的天下更必要ASP.NETMVC。
已经无邪的设法,在理论中证实了它的无邪,但在从无邪到现实的过程当中,失掉的是发展。
上面就谈谈我是怎样熟悉到这个的。比拟于结论,个中的历程更主要。
仍是以之前文章中的博客园站内短动静功效(显现以后用户短动静列表)为例,入手下手用的是jQuery插件Templates举行列表数据绑定,厥后碰到了两个成绩:
1)在绑准时必要依据前提判别天生分歧的元素,好比用户发过去的短动静,发件人显现为链接,假如是体系关照,则显现为文本。Templates对如许的操纵处置起来不是很便利;
2)绑定后的数据没法在服务端重用。偶然从搜刮引擎友爱大概用户体验的角度,在页面第一次加载时,不必ajax,在页面加载后点击革新或分页链接时,才利用ajax。如许就要在服务端与客户端分离保护数据绑定操纵。
也就是说本来服务端前往的是实体类对象列表,如今要前往的是将数据与Html组装起来的字符串。
1.入手下手我们思索的是一种丑恶的办法,用StringBuilder举行字符串拼接天生数据绑定了局,服务器端WCF服务中的代码以下:
明显这类办法易堕落,保护性差。
2.接着我们思索了第二种办法(参考自RenderUserControlasStringTemplate),经由过程WebUserControl天生字符串。WCF服务中的代码以下:
- Pagepage=newPage();Controlcontrol=page.LoadControl("~/Controls/MsgListControl.ascx");((IRenderable<List<SiteMsg>>)control).PopulateData(siteMsgList);StringBuildersb=newStringBuilder();using(StringWritersw=newStringWriter(sb)){using(HtmlTextWriterhtw=newHtmlTextWriter(sw)){control.RenderControl(htw);returnsb.ToString();}}
复制代码
因为MsgListControl.ascx的范例是静态编译天生的,以是没法经由过程强迫范例转换将control转换为MsgListControl范例,然后传送数据给它。
这里必要经由过程一个别的的IRenderable<T>接口来完成数据的绑定,MsgListControl完成了这个接口,代码以下:
- publicpartialclassMsgListControl:UserControl,IRenderable<List<SiteMsg>>{publicvoidPopulateData(List<SiteMsg>siteMsgList){rptMsgList.DataSource=siteMsgList;rptMsgList.DataBind();}}publicinterfaceIRenderable<T>{voidPopulateData(Tdata);}
复制代码
在WCF服务中经由过程挪用接口中的PopulateData办法举行数据的绑定。
这个办法增添了分外的接口,显得有些庞大。
3.厥后我们想到了ASP.NETMVC,固然不熟习,但要实验一下,看可否更好地办理这个成绩。
因而,上ASP.NETMVC3,用Razor,我们也MVC一把。
使用场景:在现有的VS2010WebSite项目中使用ASP.NETMVC3。MsgController收到哀求后,由Inbox(一个Action)将包括短动静列表的全部页面视图前往给客户端;当用户点击页面的革新大概分页链接时,经由过程Ajax倡议POST哀求以猎取短动静列表,MsgController收到哀求后,由List(一个Action)将短动静列表的视图前往给客户端。
希冀的效果:短动静列表视图能重用,Inbox与List利用的是统一个视图。
一入手下手碰到了两个小成绩:
a)MapRoute设置以后,会见呈现"HTTPError404.0-NotFound"毛病。缘故原由是会见的网址没有文件名,未走ASP.NET管线。办理办法是在web.config的system.webServer中加上以下的设置:
- <validationvalidateIntegratedModeConfiguration="false"/><modulesrunAllManagedModulesForAllRequests="true"/>
复制代码 b)持续会见,呈现“Theresourcecannotbefound.”毛病。办理办法:因为用的是WebSite项目,要将Controllers文件夹移至App_Code。
然落后进MVC相干代码编写,先从Ajax挪用部分隔始。
Controller的代码以下:
- publicclassMsgController:Controller{[HttpPost]publicActionResultList(SiteMsgQuerymsgQuery){List<SiteMsg>siteMsgList=GetInboxMsgList(msgQuery);returnView("MsgList",siteMsgList);}}
复制代码
必要注重的就一个中央:[HttpPost],既然是Ajax挪用,固然要呼应POST哀求。
View的代码(MsgList.cshtml)以下:
- @usingCNBlogs.UcHome.ExternalService.MsgWcfService@modelList<SiteMsg>@foreach(SiteMsgmsginModel){<divclass="msg_item"><divclass="msg_sender">@msg.SenderName</div><divclass="msg_title"><ahref=/msg/item/@msg.id/>@msg.Subject</a></div><divclass="msg_sendtime">@msg.SendTime.ToString("yyyy-MM-ddHH:mm")</div></div>}
复制代码
比在.ascx中写起来便利多了。
客户端js挪用代码以下:
- functionGetMsgList(pageIndex,pageSize){varmsgQuery={}msgQuery.PageIndex=pageIndex;msgQuery.PageSize=pageSize;$.ajaxSettings.dataType=plain/text;//不要用json$.ajaxSettings.url=/msg/list;$.ajaxSettings.data={"msgQuery":+JSON.stringify(msgQuery)+};$.ajaxSettings.success=function(data){$("#msg_list").html(data);};$.ajax();}
复制代码
必要注重的是两个中央(由于服务器端Controller前往的不是json格局的数据):
a)dataType不要用json,用jQuery默许的就行,假如指定的话,就用plain/text;
b)前往数据就在data中,不要经由过程data.d猎取。
如许,用ASP.NETMVC就轻松弄定Ajax挪用,比之前的WCF,StringBuider,.ascx都要便利。
本来在ASP.NETMVC中利用Ajax云云便利,完整能够代替之前用的WCF直达站。
办理了Ajax的成绩,接着处置全部页面的显现。
在页面的View中间接重用方才Ajax所用的View就好了,示例代码以下:
View(Inbox.cshtml):
- <!DOCTYPEhtml><html><head><title></title></head><body>@Html.Partial("MsgList")</body></html>
复制代码
Control:
- publicclassMsgController:Controller{publicActionResultInbox(){SiteMsgQuerymsgQuery=newSiteMsgQuery(){PageIndex=1,PageSize=30};List<SiteMsg>siteMsgList=GetInboxMsgList(msgQuery);returnView("Inbox",siteMsgList);}}
复制代码
弄定!真的很便利!想要的办理计划就是它--ASP.NETMVC!
在这里为我的毛病概念“Ajax为主的使用不必要ASP.NETMVC”向人人报歉!请人人体谅!
好勤学习,不进则退!
net网页编程的设计机制:首先产生一个中间码,第二部编译为本地(机器)码。这个机制有很大的缺点。 |
|