Html.Partial
与Html.RenderPartial
有何区别?Html.Action
与Html.RenderAction
又有何区别?Html.Partial
与Html.RenderPartial
有何区别?Html.Action
与Html.RenderAction
又有何区别?Html.Partial
返回一个字符串。Html.RenderPartial
内部调用 Write
并返回 void
。
基本用法是:
// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName"); }
// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
在上面的代码片段中,两个调用将产生相同的结果。Html.Partial
的输出存储在变量中或从方法返回,但是不能使用Html.RenderPartial
来实现此功能。
结果将在执行/评估期间写入Response
流中。Html.Action
和Html.RenderAction
。Html.Partial()
是为了在 Razor 中有更流畅的语法而创建的。正如 @Vlad 所说,Html.RenderPartial()
更有效率。 - Tsahi Asher@Html.Partial("Whatever")
是cshtml文件中唯一的一行,那么页面加载需要很长时间。在其前面或后面添加一个换行符(或任何内容)可以解决此问题,并且使用等效的RenderPartial
方法不会出现此问题。 - General Grievance将@Html.Partial视为复制到父页面中的HTML代码。
将@Html.RenderPartial视为嵌入到父页面中的.ascx用户控件。 .ascx用户控件的开销更大。
'@Html.Partial'返回一个HTML编码的字符串,它与父级一起构建。 它访问父模型。
'@Html.RenderPartial'返回等效于.ascx用户控件。 它拥有自己的页面ViewDataDictionary的副本,并且对RenderPartial的ViewData所做的更改不会影响父ViewData。
使用反射我们发现:
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);
}
Partial
渲染到缓冲区并不意味着它是异步渲染的——相反,我无法理解你如何声称RenderPartial
是“更加资源密集型”的。 - Dai以下是我的发现:
如果您没有模型需要发送到视图,并且需要返回许多HTML而不需要将其存储在变量中,那么请使用RenderAction。
如果您没有模型需要发送到视图,并且需要返回一小段文本并将其存储在变量中,请使用Action。
如果您有一个模型需要发送到视图,并且有很多HTML不需要存储在变量中,请使用RenderPartial。
如果您有一个模型需要发送到视图,并且需要存储一小段文本,请使用Partial。
RenderAction和RenderPartial更快。
第一个返回一个MvcHtmlString
,而第二个(Render..
)直接输出到响应中。
@Html.Partial
和@Html.RenderPartial
用于当你的部分视图模型与父模型对应时,无需创建任何操作方法即可调用此视图。
@Html.Action
和@Html.RenderAction
用于当您的部分视图模型独立于父模型时,基本上它用于您想在页面上显示任何小部件类型内容。要在视图中调用方法,必须创建一个返回部分视图结果的操作方法。
@Html.RenderPartial()
比 @Html.Partial()
执行更快,这是因为 Html.RenderPartial 能够快速响应输出。
因为当我使用@Html.Partial()
时,与 @Html.RenderPartial()
相比,我的网站加载时间更长。更多关于问题的信息:
当仅使用局部视图的名称调用Html.RenderPartial()时,ASP.NET MVC将会把与调用视图模板相同的Model和ViewData字典对象传递给局部视图。
摘自《Professional ASP.NET MVC 1.0》中的“NerdDinner”章节。
区别:
RenderPartial
的返回类型为 void
,而 Partial
返回 MvcHtmlString
在 Razor 视图中调用 Partial()
和 RenderPartial()
方法的语法
@Html.Partial("PartialViewName")
@{ Html.RenderPartial("PartialViewName"); }
在 WebForm 视图中调用 Partial()
和 RenderPartial()
方法的语法
[%: Html.Partial("PartialViewName") %]
[% Html.RenderPartial("PartialViewName"); %]
下面是与 Partial()
和 RenderPartial()
相关的两个常见面试问题:
Partial()
和 RenderPartial()
?
主要区别在于 RenderPartial()
返回 void
并且输出将直接写入输出流中,而 Partial()
方法返回 MvcHtmlString
,可以将其分配给变量并进行必要的操作。因此,当需要将输出分配给变量以进行操作时,请使用 Partial(),否则请使用 RenderPartial()。
哪一个性能更好?
从性能的角度来看,直接渲染到输出流中会更好。RenderPartial()
恰好做到这一点,并且对于性能而言优于 Partial()
。
Partial或RenderPartial:无需创建操作方法。当要在当前页面模型中显示的数据已经存在于局部视图的模型中时使用。
Action或RenderAction:需要子操作方法。当要在视图上显示的数据具有独立模型时使用。
Html.RenderAction
的返回类型为void
,这意味着它直接在视图中呈现响应,而Html.Action
的返回类型是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();
}
}
这将返回视图的HTML字符串。
同样适用于Html.Partial
和Html.RenderPartial