Html.Partial 与 Html.RenderPartial 和 Html.Action 与 Html.RenderAction

在 ASP.NET MVC 中,两者之间有什么区别?

  • Html.PartialHtml.RenderPartial
  • Html.ActionHtml.RenderAction

答案

// Razor syntax
@Html.Partial("ViewName")
@{ Html.RenderPartial("ViewName");  }

// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>
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 时,请使用RenderAction

当您没有要发送到视图的模型并且没有一点文本可以带回需要存储在变量中的文本时,请使用Action

当您有要发送到视图的模型时,请使用RenderPartial ,并且将有很多不需要存储在变量中的 html。

当您有要发送到视图的模型时,请使用 “ 部分” ,并且需要将少量文本存储在变量中。

RenderActionRenderPartial更快。

据我说,由于 Html.RenderPartial 对 Output 作出快速响应,因此@Html.RenderPartial()执行速度比@Html.Partial()快。

因为当我使用@Html.Partial() ,与@Html.RenderPartial()相比,我的网站需要更多的时间来加载

当您的 Partial 视图模型与父模型相对@Html.RenderPartial将使用@Html.Partial@Html.RenderPartial ,我们不需要创建任何操作方法即可调用此方法。

当部分视图模型独立于父模型时,将使用@Html.Action@Html.RenderAction ,基本上,当您要在页面上显示任何小部件类型的内容时,都可以使用@Html.Action@Html.RenderAction 。您必须创建一个操作方法,该方法在从视图调用该方法时会返回部分视图结果。

有关此问题的更多信息:

“仅使用部分视图的名称调用 Html.RenderPartial()时,ASP.NET MVC 会将与调用视图模板使用的相同的 Model 和 ViewData 字典对象传递给部分视图。”

专业 ASP.NET MVC 1.0 中的 “NerdDinner”

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();
        }
    }

Partial 或 RenderPartial:无需创建操作方法。当前页面模型中已经存在要在部分视图上显示的数据时使用。

Action 或 RenderAction:需要子操作方法。当数据显示在视图上具有独立模型时使用。

差异:

  1. RenderPartial的返回类型为void ,其中Partial返回MvcHtmlString

  2. 在 Razor 视图中调用Partial()RenderPartial()方法的语法

    @ Html.Partial(“PartialViewName”)
    @ {Html.RenderPartial(“ PartialViewName”); }

  3. 在 Webform 视图中调用Partial()RenderPartial()方法的语法

[%:Html.Partial(“ PartialViewName”)%]
[%Html.RenderPartial(“ PartialViewName”); %]

以下是与Partial()RenderPartial()相关的 2 个常见面试问题。何时在RenderPartial()使用Partial() ,反之亦然?

主要区别在于RenderPartial()返回 void,输出将直接写入输出流,其中,随着Partial()方法返回MvcHtmlString ,可以将其分配给变量并在需要时进行操作。因此,当需要将输出分配给变量进行操作时,请使用 Partial(),否则请使用 RenderPartial()。

哪一个性能更好?

从性能的角度来看,直接渲染到输出流更好。 RenderPartial()做完全相同的事情,并且性能优于Partial()