Html.Partial与Html.RenderPartial&Html.Action与Html.RenderAction
在ASP.NET MVC中,有什么区别:
-
Html.Partial
和Html.RenderPartial
-
Html.Action
和Html.RenderAction
Html.Partial
返回一个string。 Html.RenderPartial
调用内部Write
并返回void
。
基本用法是:
// Razor syntax @Html.Partial("ViewName") @{ Html.RenderPartial("ViewName"); } // WebView syntax <%: Html.Partial("ViewName") %> <% Html.RenderPartial("ViewName"); %>
在上面的代码片段中,两个调用都会产生相同的结果。
虽然可以将Html.Partial
的输出存储在一个variables中,或者将其从方法中返回,但是不能用Html.RenderPartial
。 结果将在执行/评估过程中写入Response
stream。
这也适用于Html.Action
和Html.RenderAction
。
将@ Html.Partial想象成复制到父页面的HTML代码。 把@ Html.RenderPartial想象成一个并入父页面的.ascx用户控件。 一个.ascx用户控件有更多的开销。
'@ Html.Partial'返回一个html编码的string,与父级内联构build。 它访问父母的模型。
'@ Html.RenderPartial'返回一个.ascx用户控件的等价物。 它获取页面的ViewDataDictionary的副本,并且对RenderPartial的ViewData所做的更改不会影响父级的ViewData。
使用reflection我们发现:
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData) { MvcHtmlString mvcHtmlString; using (StringWriter stringWriter = new StringWriter(CultureInfo.CurrentCulture)) { htmlHelper.RenderPartialInternal(partialViewName, viewData, model, stringWriter, ViewEngines.Engines); mvcHtmlString = MvcHtmlString.Create(stringWriter.ToString()); } return mvcHtmlString; } public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName) { htmlHelper.RenderPartialInternal(partialViewName, htmlHelper.ViewData, null, htmlHelper.ViewContext.Writer, ViewEngines.Engines); }
差异是第一个返回一个MvcHtmlString
但第二个( Render..
)输出直接响应。
这是我发现的:
如果没有模型发送到视图并使用了很多的HTML,那么不需要存储在一个variables中就可以使用RenderAction 。
当你没有一个模型发送到视图,并有一点点的文本,带回需要被存储在一个variables,使用动作。
当你有一个模型发送到视图时使用RenderPartial ,并且会有很多html不需要存储在variables中。
当你有一个模型发送到视图,并且会有一些需要存储在variables中的文本时使用部分 。
RenderAction和RenderPartial更快。
根据我@Html.RenderPartial()
有更快的执行比@Html.Partial()
由于Html.RenderPartial快速响应输出。
因为当我使用@Html.Partial()
,我的网站比@Html.RenderPartial()
要花费更多的时间来加载。
当您的部分视图模型是父模型的对应关系时使用@Html.Partial
和@Html.RenderPartial
,我们不需要创build任何操作方法来调用它。
@Html.Action
和@Html.RenderAction
用于当你的部分视图模型与父模型是独立的时候,基本上当你想在页面上显示任何部件types的内容的时候使用。 您必须创build一个操作方法,该方法从视图调用方法时返回部分视图结果。
更多关于这个问题:
“当调用Html.RenderPartial()时只使用局部视图的名称时,ASP.NET MVC会将与调用视图模板使用的相同的Model和ViewData字典对象传递给局部视图。
来自Professional ASP.NET MVC 1.0的“NerdDinner”
Html.RenderAction
的返回types是void
,这意味着它直接在View中呈现响应,其中Html.Action
的返回types是MvcHtmlString
您可以在控制器中捕获其呈现视图,并使用以下方法修改它
protected string RenderPartialViewToString(string viewName, object model) { if (string.IsNullOrEmpty(viewName)) viewName = ControllerContext.RouteData.GetRequiredString("action"); ViewData.Model = model; using (StringWriter sw = new StringWriter()) { ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName); ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw); viewResult.View.Render(viewContext, sw); return sw.GetStringBuilder().ToString(); } }
这将返回视图的Htmlstring。
这也适用于Html.Partial
和Html.RenderPartial
Partial或RenderPartial:不需要创build操作方法。 在当前页面的模型中已经存在部分视图上显示的数据时使用。
Action或RenderAction:需要小孩操作方法。 当数据在视图上显示时使用具有独立模型。
Html.Partial
:返回MvcHtmlString
并且很慢
Html.RenderPartial
:在输出stream上直接渲染/写入,并返回void
,与Html.Partial
相比非常快
区别:
-
RenderPartial
的返回types是void
,其中Partial
返回MvcHtmlString
-
用于在Razor视图中调用
Partial()
和RenderPartial()
方法的语法@ Html.Partial( “PartialViewName”)
@ {Html.RenderPartial(“PartialViewName”); } -
调用webform视图中的
Partial()
和RenderPartial()
方法的语法
[%:Html.Partial(“PartialViewName”)%]
[%Html.RenderPartial(“PartialViewName”); %]
以下是与Partial()
和RenderPartial()
相关的2个常见面试问题。何时使用Partial()
不是RenderPartial()
,反之亦然?
主要区别在于RenderPartial()
返回void,输出将直接写入输出stream,在那里Partial()
方法返回MvcHtmlString
,可以将其分配给一个variables并在需要时对其进行处理。 因此,当需要将输出分配给variables来操作它时,使用Partial(),否则使用RenderPartial()。
哪一个更好的performance?
从性能angular度来看,直接渲染到输出stream更好。 RenderPartial()
完成同样的事情,性能优于Partial()
。
对于“部分”我总是使用它如下:
如果您需要在页面中包含某些内容(如使用Ajax调用),请使用“Html.RenderPartial”。
如果你有一个“静态”的include,那么这个包就没有和控制器本身链接,而只是在“shared”文件夹中,例如使用“HTML.partial”
@Html.Partial
以HTML编码的string返回视图,并使用相同的视图TextWriter
对象。 @Html.RenderPartial
这个方法返回void
。 @Html.RenderPartial
比@Html.Partial
更快
PartialView
的语法:[HttpGET] public ActionResult AnyActionMethod {return PartialView(); }