在 ASP.NET MVC 中,有什么区别:
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 视为复制到父页面的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
是“更多资源密集型”。
这是我发现的:
当您没有要发送到视图的模型并且有很多不需要存储在变量中的 html 要带回时,请使用 RenderAction。
当您没有要发送到视图的模型并且需要带回一些需要存储在变量中的文本时,请使用 Action。
当你有一个模型要发送到视图并且会有很多不需要存储在变量中的 html 时,请使用 RenderPartial。
当您有一个模型要发送到视图并且会有一点文本需要存储在变量中时,请使用 Partial。
RenderAction 和 RenderPartial 更快。
不同之处在于第一个返回 MvcHtmlString
而第二个 (Render..
) 直接输出到响应。
@Html.Partial
和 @Html.RenderPartial
用于当您的 Partial 视图模型是父模型的对应关系时,我们不需要创建任何操作方法来调用它。
@Html.Action
和 @Html.RenderAction
用于您的局部视图模型独立于父模型时,基本上它用于您想在页面上显示任何小部件类型的内容。在从视图中调用该方法时,您必须创建一个返回部分视图结果的操作方法。
据我说,@Html.RenderPartial()
的执行速度比 @Html.Partial()
快,因为 Html.RenderPartial 可以快速响应输出。
因为当我使用 @Html.Partial()
时,与 @Html.RenderPartial()
相比,我的网站需要更多时间来加载
更多关于这个问题:
“当仅使用局部视图的名称调用 Html.RenderPartial() 时,ASP.NET MVC 会将调用视图模板使用的相同模型和 ViewData 字典对象传递给局部视图。”
来自 Professional ASP.NET MVC 1.0 的“NerdDinner”
Partial 或 RenderPartial:无需创建动作方法。当要在局部视图上显示的数据已经存在于当前页面的模型中时使用。
Action 或 RenderAction:需要子操作方法。当要在视图上显示的数据具有独立模型时使用。
差异:
RenderPartial 的返回类型为 void,其中 Partial 返回用于在 Razor 视图中调用 Partial() 和 RenderPartial() 方法的 MvcHtmlString 语法 @Html.Partial("PartialViewName") @{ Html.RenderPartial("PartialViewName");在 webform 视图中调用 Partial() 和 RenderPartial() 方法的语法
[%: Html.Partial("PartialViewName") %] [% Html.RenderPartial("PartialViewName"); %]
以下是与 Partial()
和 RenderPartial()
相关的 2 个常见面试问题,您何时使用 Partial()
而不是 RenderPartial()
,反之亦然?
主要区别在于 RenderPartial()
返回 void 并且输出将直接写入输出流,而 Partial()
方法返回 MvcHtmlString
,可以将其分配给变量并在需要时对其进行操作。因此,当需要将输出分配给变量以进行操作时,请使用 Partial(),否则使用 RenderPartial()。
哪一个对性能更好?
从性能的角度来看,直接渲染到输出流更好。 RenderPartial()
的作用完全相同,并且比 Partial()
的性能更好。
Html.RenderAction
的返回类型是 void
表示它直接在 View 中呈现响应,其中 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
Html.Partial
:返回 MvcHtmlString
并且慢
Html.RenderPartial
:直接在输出流上渲染/写入并返回 void
,与 Html.Partial
相比非常快
@Html.Partial
返回 HTML 编码字符串中的视图并使用相同的视图 TextWriter
对象。 @Html.RenderPartial
此方法返回 void
。 @Html.RenderPartial
比 @Html.Partial
快
PartialView
的语法:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}
对于“部分”,我总是按如下方式使用它:
如果您需要在需要通过控制器的页面中包含某些内容(就像使用 Ajax 调用一样),请使用“Html.RenderPartial”。
例如,如果您有一个未链接到控制器本身并且仅在“共享”文件夹中的“静态”包含,请使用“HTML.partial”
Html.Partial()
是为了在 Razor 中使用更流畅的语法。正如@Vlad 所说,Html.RenderPartial()
效率更高。