转载并勘正自:https://blog.51cto.com/u_176133/3336084
Html.partial和RenderPartial的用法与区别
Html.partial和RenderPartial都是输出html片段,区别在于:
Partial 是将视图内容直接生成一个字符串并返回(相当于有个转义的过程),
RenderPartial方法 是直接输出至当前 HttpContext(因为是直接输出,所以性能好)。
因此它们在视图中的使用方式是不同的:
MVC2:
<%Html.RenderPartial("PartialView");%>输出到 HttpContext
<%=Html.Partial("PartialView")%> 输出为string 直接到页面
MVC3:
@Html.Partial("BasicChart")
@{
Html.RenderPartial("BasicChart");
}
Html.partial和RenderPartial的其它三个重载很有用:
第二个重载: @{Html.RenderPartial("BasicChart", model);}
用这个重载可以在部分视图里使用强类型,然后在主视图中使用第二个参数传model过去,而不用controller,比如从list中传其中一项myClass过去
第三个重载: 如:@{Html.RenderPartial("BasicChart", model, new ViewDataDictionary { { "key", "value" } };}
在第二个重载的基础上,增加一个参数传递ViewData
Partial 和RenderPartial:
这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样
Partial 回传的一个Object (MvcHtmlString), 回传一个String 把一堆Html给回传出来, 然后写进到主页面上
@Html.Partial("ViewName")
RenderPartial 回传的是void, 而这个方法会在主页面上添加指定的View
@{
Html.RenderPartial("ViewName");
}
这两个方法没有用到Controller Action, 是直接把一个View(Page) 给加进来,而RenderAction 有点不一样, 这是一个Action, 所以会用到Controller Action之后再回传一个页面
public class ChildActionOnlyTestController : Controller
{
[ChildActionOnly]
public ActionResult GetSupplierList()
{
var controller = new SupplierController();
return controller.SupplierList();
}
}
RenderPartial和RenderAction两者的相同点
通常都被用来显示一个功能相对独立的“块”,比如说显示菜单或者导航条。 两者输出的结果都被作为调用的View的一部分显示。
两者的不同点
- RenderPatial的数据来自于调用的View,而RenderAction来自自己。
- RenderAction会发起一个新的Request,而RenderPatial不会。【个人在实践中在Chrome的Network Tab发现从浏览器端发起的只有主体View页面的那个Request,Response一个组合后的页面, 由此可见该RenderAction发起的新的Request是在服务端一并请求后后主体View页面一并返回的】
@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中使用return PartialView()指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效。
4种PartialView对比:
PartialView
<div>Just a PartialView Test!@ViewBag.Test</div>
@ViewBag.Test
View:
<p>
@{Html.RenderPartial("ViewUserControl1");}
@Html.Partial("ViewUserControl1")
@{Html.RenderAction("ViewUserControl1");}
@Html.Action("ViewUserControl1")
</p>
Controller:
//Controller:
[ChildActionOnly] //防止直接调用
public ActionResult ViewUserControl1()
{
ViewBag.Test = "(Action)调用";
return PartialView();
}
效果:
------------------------------------------------------------------------------------------------------------------
以下内容为更早期转载自:
https://www.cnblogs.com/yaomeng/p/4833346.html
《MVC中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别》
Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的。
1. Html.RenderPartial是直接将用户控件嵌入到界面上:
<%Html.RenderPartial("LogOnUserControl");%>
或
<%Html.RenderPartial("~/Areas/Comm/Views/Shared/LogOnUserControl.ascx");%>
注意:用第一种方法时,用户控件必须放在调用者同一目录下,也可以放在View/Shared中。
2. Html.RenderAction则通过Controller中的Action来调用用户控件
Controller:用户控件所在Controller
public ActionResult UserControl()
{
return PartialView();
}
View:调用用户控件的View
< %Html.RenderAction("UserControl","Controller");%>
RenderPartial和RenderAction都是在Asp.net Mvc中用来显示PartialView的方法,所以在什么时候用哪个方法就是碰到的第一个问题。而要做出正确的选择就需要对这两个都有充分的了解,并且 知道其异同点。这也是本文的主题。
什么是Html.RenderPartial?
Html.RenderPartial在Asp.net Mvc中是用来调用PartialView的。PartialView基本上就是Asp.net Webform中的UserControl。调用也很简单,只要在View中把PartialView的名字作为参数传递就可以。比如:
<% Html.RenderPartial("YourPartialView", YourData); %>
YourData是一个可选的参数。如果有,那么YourData会被赋给PartialView中的Model。如果没有,那么调用 RenderPartial的View中的Mode和ViewData会被传递给PartialView。也就是说,PartialView的数据来自于 调用的View。
什么是Html.RenderAction?
Html.RenderAction允许你直接调用某一个Action,并把返回的结果直接显示在当前调用的View中。比如:
<% Html.RenderAction("Show", "Tag"); %>
此时,TagController中的Show方法会被调用。由于这时调用的是一个Action方法,因此可以在此方法中完成你想要完成的各种操作,比如从数据库,文件等获取数据,写数据等并返回结果。
[OutputCache(Duration=6000)]
public ActionResult Show()
{
var tagData = null;
//Get data from database
//tagData = tagService.AllHot();
return PartialView("TagCloud", tagData);
}
TagCloud是一个简单的PartialView文件而已。
两者的相同点
1.RenderPatial的数据来自于调用的View,而RenderPatial来自自己。
2.RenderAction会发起一个新的Request,而RenderPatial不会。【个人在实践中在Chrome的Network Tab发现从浏览器端发起的只有主体View页面的那个Request,Response一个组合后的页面, 由此可见该RenderAction发起的新的Request是在服务端一并请求后后主体View页面一并返回的】
如何选择
根据两者不同点中的第二点,由于RenderAction会调用一个新的Action方法,而Asp.net Mvc中Action是最小的缓存单位,因此如果某一个“块”的数据比较固定,不会因为访问者的不同而发生变化,那么这时就是使用 RenderAction的时候了。 题外话,对于RenderAction会发起一个新的Request,感觉对调用页面的流程有点破坏。一个View在显示的时候,自己又发起一个 Request去获取数据来显示,显然有点破坏了作为一个View的原则:A View should only know how to render, but not what to render!
对这四个的区别做一个总结,清理一下思路,方便以后使用:
1、带有Render的方法 @Html.Partial 对应 @{Html.RenderPartial(....);} @Html.Action 对应 @{Html.RenderAction(....);}
2、Action、RenderAction加载方法的视图,执行
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");