本文连接:http://www.cnblogs.com/likeli/p/4236723.htmlhtml
文章集合:http://www.cnblogs.com/likeli/category/651581.htmlajax
向服务器请求HTML标签来更新网页的内容,这种方法就叫“部分渲染”,这是属于Ajax的基本过程。编程
部分渲染技术包括了发送异步请求给服务器,服务器返回包含HTML代码的数据插入到指定的页面区域。这种方法十分的高效并且简单。跨域
在Asp.Net MVC中,会把部分渲染当作普通的请求同样对待:请求被路由解析到特定的控制器,控制器执行特定的操做逻辑。安全
普通渲染和渲染部分视图的区别:一般的渲染方法是使用controller.View()帮助方法返回ViewResult;而部分渲染须要调用Controller.Partial()帮助方法来返回PartialViewResult对象。这与ViewResult相似,PartialViewResult只渲染包含视图的内容,不会渲染外围布局。服务器
1)控制器调用Controller.View()方法:框架
1 return View("Auction",auction);
最终是整页渲染。异步
2)控制器调用Controller.PartialVIew()方法:布局
1 return PartialView("Auction",acution);
部分渲染除了将VIew()换成PartialView()方法,其余的同样。惟一的区别就是PartialViewResult只渲染HTML标签内容,不包含外围布局和母版页的内容。其余包括Razor语法,HTML、URL帮助类都同样使用。性能
不过要注意:由于部分视图不包含外围布局,因此CSS或者Javascript外部文件必定要直接在部分视图中引用。
这部分类容,可使用Jquery的load()方法快速实现。
1 function showAuctino(id) 2 { 3 $("#content").load("/Auction/PartialAuction/"+id); 4 }
上面的代码如果用URLHelper则能够这样写:'@Url("PartialAuction","Auction")' + id
其实从上面的部分视图渲染能够看出,这种渲染方式很是的浪费资源,很明显的,有些内容彻底不用在服务端建立和传回,js足矣完成。
可是使用客户端渲染有两个必须的条件:
1)服务端能够产生序列化的数据
2)客户端知道怎么把这些序列化的数据转换成标准的HTML代码
这里使用Ajax请求数据,Asp.Net MVC提供了对原生Json的支持,使用JsonResult操做结果对象。所以,咱们能够直接使用Controller.Json()方法来建立包含可序列化对象的JsonResult。
1 return Json(action,JsonRequestBehavior.AllowGet);
那么这个控制器返回的应答消息就包含了序列化的Json格式数据。
上面代码中的第二个参数是必须的,由于默认状况下,MVC是不容许get方式HTTP请求Json数据的。这样就能够避免Json劫持风险。所以,这里须要设置容许Get请求Json。
可是最好的作法仍是用属性标记限制只让POST方法提交请求,来避免此类安全漏洞。
1 [HttpPost] 2 public ActionResult JsonAuction(int id) 3 { 4 ... 5 return Json(acution); 6 }
到这里,Json数据已经请求回来了,那么,咱们就须要在客户端进行处理了,这里使用客户端模板,也就是模板引擎来渲染。固然要是不复杂的内容,你彻底能够本身拼接字符串来输出的。
这里我使用的是贤心的laytpl模板渲染引擎(http://sentsin.com/layui/laytpl/):
1 //第一步:编写模版。你可使用一个script标签存放模板,如: 2 <script id="demo" type="text/x-template"> 3 <h1>{{ d.title }}</h1> 4 <ul> 5 {{# for(var i = 0, len = d.list.length; i < len; i++){ }} 6 <li> 7 <span>姓名:{{ d.list[i].name }}</span> 8 <span>城市:{{ d.list[i].city }}</span> 9 </li> 10 {{# } }} 11 </ul> 12 </script> 13 14 //第二步:创建视图。用于呈现渲染结果。 15 <div id="view"></div> 16 17 //第三步:渲染模版 18 function updateAuctionInfo(id) 19 { 20 $.ajax({ 21 url:"/Auction/JsonAuction/" + id, 22 sucction:function(result){ 23 var gettpl = document.getElementById('demo').innerHTML; 24 laytpl(gettpl).render(result, function(html){ 25 document.getElementById('view').innerHTML = html; 26 } 27 }) 28 }
那么到这里,以上代码就完成了一个Ajax的性能提高功能,不过这里仍是能够改进的。咱们继续...
做为MVC框架,很重要的一点就是“分离关注点”,正常状况下,MVC的应用逻辑是不该该绑定到视图中的。在上面写的例子代码中,存在这一个状况,给同一个视图输出的内容中,咱们使用了PartialView、View,咱们是作的同一个动做--输出HTML标签内容,惟一不同的就是返回的内容不同。
所以,咱们能够想办法减去这些重复的逻辑代码,幸运的是,MVC提供了Request.IsAjaxRequest()扩展方法,这个方法能够帮咱们来验证当前的请求是不是Ajax。那么灵感来了。
1 Public ActionResult Auction(int id) 2 { 3 //获取数据源 4 ... 5 if(Request.IsAjaxRequest()) 6 { 7 return PartialView("Auction",auction); 8 } 9 else 10 { 11 return View("Auction",auction); 12 } 13 }
那么,这样修改以后,Auction控制器就能够同时响应两种请求了:HTTP get 和Ajax,而逻辑代码不变。
这里,个人需求又有点儿变化,我在请求的时候,想要可以请求完整HTML代码,也想可以请求Json数据。咋办?
这点MVC没办法,并无提供像上面验证Ajax的方法相似的,用来验证是否请求Json的方法。不过,这点儿其实也难不倒聪明的程序猿。在Ajax请求的时候,外加一个参数,指定请求内容为Json就好了。例:/Auctions/Auction/1?IsJson=Json
查看源码,发现AjaxRequestExtensions是静态类,不能继承。
那么,将这个本身定义的验证是否请求Json的方法扩展一下:
1 public static class JsonRquestExtensions 2 { 3 public static bool IsJsonRquest(this HttpRequestBase request) 4 { 5 return string.Equals(request["IsJson"], "Json"); 6 } 7 }
1 if (Request.IsJsonRquest()) 2 { 3 return Json(auction); 4 } 5 else 6 { 7 return View("Auctino", auction); 8 }
这样就好了,再整合一下以前写的内容:
1 if (Request.IsJsonRquest()) 2 { //Json请求 3 return Json(auction); 4 } 5 else if (Request.IsAjaxRquest()) 6 { //Ajax请求 7 return PartialView("Auxtion", auction); 8 } 9 else 10 { //默认使用布局的请求 11 return View("Auctino", auction); 12 }
经过上面的一连串逻辑判断,让一个控制器Action完成了部分视图渲染和判断Json请求返回数据的判断逻辑。
说到这里,又要引入一个新的东西了:过滤器。具体的说应该是操做过滤器。
原谅我再次无耻的盗图一张(虽然图是我本身画的),此图引用了《Asp.Net MVC5框架揭秘》的图,这里说明了这个过滤器的执行过程。
操做过滤器涉及到ActionFilter类型的使用。如上图所示,全部的ActionFilter类型都实现了IActionFilter接口,这个接口的两个方法OnActionExecution和OnActionExecuted会分别在目标Action方法执行先后被调用。如图:
既然有在Action方法执行前调用,那么咱们就能够在这里作文章了。
重写一下OnActionExecuted方法,将Ajax、Json等请求方式判断逻辑加入其中。
那么,这样就构建了一个操做过滤器,这个操做过滤器的做用就是在多个控制器上重用统一的逻辑规则。
好叻,到这里使用Ajax提高网站性能和交互就基本完成了,固然实际操做中并非这么简单的,此处仅作入门。
举个例子,假如是复杂的Json的话,那就须要作不少工做了。下一章继续来弄这个,基本上说说复杂Json如何操做、如何提升Json的收发效率、跨域的Ajax请求等。
《Asp.Net MVC5 框架揭秘》、《Asp.Net MVC4 Web编程》