ASP.NET网站制作之现实证实Ajax的天下更必要ASP.NET MVC仓酷云
今天去面试,被问到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{publicActionResultList(SiteMsgQuerymsgQuery){List<SiteMsg>siteMsgList=GetInboxMsgList(msgQuery);returnView("MsgList",siteMsgList);}}
必要注重的就一个中央:,既然是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网页编程的设计机制:首先产生一个中间码,第二部编译为本地(机器)码。这个机制有很大的缺点。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 众所周知,Windows以易用而出名,也因此占据不少的服务器市场。 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 逐步缩小出错代码段的范围,最终确定错误代码的位置。 是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 对于中小项目来说.net技术是完全可以胜任,但为什么现在大型公司或网站都选择php或java呢?就是因为微软不够开放,没有提供从硬件到应用服务器再到业务应用的整套解决方案。 ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。 但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
页:
[1]