协慌网

登录 贡献 社区

Html.Partial vs Html.RenderPartial&Html.Action vs Html.RenderAction

在 ASP.NET MVC 中,有什么区别:

  • Html.PartialHtml.RenderPartial
  • Html.ActionHtml.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的输出存储在变量中或从方法返回,但是不能使用Html.RenderPartial执行此Html.RenderPartial 。结果将在执行 / 评估期间写入Response流。

这也适用于Html.ActionHtml.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);
}

差异是第一个返回MvcHtmlString但第二个( Render.. )直接返回响应。