1、 Html.partial和RenderPartial的区别
Html.partial和RenderPartial都是输出html片段,区别在于:
@Html.Partial用于将分部视图渲染为字符串, 是将视图内容直接生成一个字符串并返回(相当于有个转义的过程)。@{Html.RenderPartial}方法是将分布视图直接写入响应输出流(当前 HttpContext)(因为是直接输出,所以性能好,微量影响)。使用所以只能直接放在代码块中,不能放在表达式中(返回值是void)。使用方式是不同:@Html.Partial("BasicChart")//输出为string 直接到页面
@{
Html.RenderPartial("BasicChart");//输出到 HttpContext
}
Html.partial和RenderPartial的其它三个重载很有用,第二个重载@{Html.RenderPartial("BasicChart",model);}
用这个重载可以在部分视图里使用强类型,然后在主视图中使用第二个参数传model过去,而不用controller,比如从list中传其中一项myClass过去
第三个重载用来传ViewData同理,如:@{Html.RenderPartial("BasicChart",ViewData["myData"]);}
具体:
这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上
@Html.Partial("ViewName")
RenderPartial 回传的是void, 而这个方法会在主页面上添加指定的View
@{Html.RenderPartial("ViewName");}
这两个方法没有用到Controller, 是直接把一个View(Page) 给加进来
注意:分部视图必须放在调用者同一目录下,或者放在View/Shared中
2、与RenderAction比较
RenderAction 有点不一样, 这是一个Action, 所以会用到Controller 之后再回传一个页面
public class ChildActionOnlyTestController : Controller
{
[ChildActionOnly] //防止直接调用 (在浏览器中直接访问)
public ActionResult GetSupplierList()
{
var controller = new SupplierController();
return controller.SupplierList();
}
}
3、RenderPartial和RenderAction两者的相同点
通常都被用来显示一个功能相对独立的“块”,比如说显示菜单或者导航条。 两者输出的结果都被作为调用的View的一部分显示。两者的不同点
1、RenderPatial的数据来自于调用的View,而RenderAction来自自己。
2、RenderAction会发起一个新的Request,而RenderPatial不会
@Html.Partial/@{Htmt.RenderPartial()}
@Html.Partial用于将分部视图渲染为字符串
@{Html.RenderPartial}将分布视图直接写入响应输出流,所以只能直接放在代码块中,不能放在表达式中(返回值是void)
RenderPartial因为是直接写在响应流中,所以性能会更好(微量影响),而Partial不用写在代码块中,所以更方便
@Html.Action()/@Html.RenderAction()
和Partial与RenderPartial类似,但是因为会通过Action,所以更灵活,可以利用控制器上下文。
在Action中可以通过IsChildAction来判断是被Url直接调用还是被Action()/RenderAction()调用
可以利用重载直接参数给Action。
RenderAction优先使用ActionNameAttribute。
Action中使用returnPartialView()指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效。
几种PartialView对比:
PartialView:
<div>Just aPartialView Test!@ViewBag.Test</div>
@ViewBag.Test
View:
<p>
@{Html.RenderPartial("ViewUserControl1");}
@Html.Partial("ViewUserControl1")
@{Html.RenderAction("ViewUserControl1");}
@Html.Action("ViewUserControl1")
</p>
Controller:
Controller:
[ChildActionOnly]//防止直接调用(在浏览器中直接访问)
publicActionResult ViewUserControl1()
{
ViewBag.Test = "(Action)调用";
return PartialView();
}
效果:
Just a PartialViewTest!
Just a PartialViewTest!
Just a PartialViewTest!(Action)调用
(Action)调用
Just a PartialViewTest!(Action)调用
(Action)调用
综合一下:
1、带有Render的方法
@Html.Partial 对应 @{Html.RenderPartial(....);}
@Html.Action 对应 @{Html.RenderAction(....);}
2、Action、RenderAction加载方法的视图,执行Controller → Model → View的顺序,然后把产生的页面带回到原来的View中再回传。而Partial、RenderPartial直接加载视图文件内容,执行
3. Html.Partial可以直接提供用户控件名作为参数,而Html.Action需要有对应的Action,在Action内部返回PartailResult(即retun PartialView())。
4、对于简单的没有任何逻辑的用户控件,推荐使用Html.Partial;对于需要设置一些Model的用户控件,推荐使用Html.Action。当然,有Model数据也是可以使用Html.Partial方法的,可以看方法的重载。
5、使用Html.Action有个好处,就是可以根据不同的场景选择不同的用户控件。比如:
@Html.Action("UserInfoControl")
在对应的UserInfoControl这个Action中,在用户未登录的时候,可以retun PartialView("LogOnUserControl");登录后,可以retun PartialView("UserInfoControl");
如何选择:
根据不同点(RenderAction会发起一个新的Request,而RenderPatial不会
),由于RenderAction会调用一个新的Action方法,而Asp.net Mvc中Action是最小的缓存单位,因此如果某一个“块”的数据比较固定,不会因为访问者的不同而发生变化,那么这时就是使用 RenderAction的时候了。 题外话,对于RenderAction会发起一个新的Request,感觉对调用页面的流程有点破坏。一个View在显示的时候,自己又发起一个 Request去获取数据来显示,显然有点破坏了作为一个View的原则:
A View should onlyknow how to render, but not what to render!
参考:
http://blog.csdn.net/wilsonke/article/details/11668181
http://www.cnblogs.com/firstcsharp/p/5232171.html
http://www.cnblogs.com/gesenkof99/archive/2013/06/03/3115052.html