Html.Partial与Html.RenderPartial的区别以及Html.Action与Html.RenderAction的区别

1083
在ASP.NET MVC中,Html.PartialHtml.RenderPartial有何区别?Html.ActionHtml.RenderAction又有何区别?


2
这可能会有所帮助。看一下这个链接:https://dev59.com/uIrda4cB1Zd3GeqPSOPX#30258091 - Nikhil Saswade
13个回答

1277

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.ActionHtml.RenderAction

78
你知道为什么要使用其中一个而不是另一个吗? - Jason
165
性能方面,最好使用RenderPartial,就像这里回答的一样:https://dev59.com/iHE85IYBdhLWcg3whUBr - Vlad Iliescu
13
感谢提到将结果存储到变量中的技巧。这是使用Partial或Action而不是Render的原因所在。 - David Kassa
8
Html.Partial() 是为了在 Razor 中有更流畅的语法而创建的。正如 @Vlad 所说,Html.RenderPartial() 更有效率。 - Tsahi Asher
2
@Tsahi 这就是为什么它在MVC项目模板中用于_LoginPartial的解释。谢谢。 - regularmike
也许有关系?我在使用VS2019时发现了一个奇怪的问题。如果@Html.Partial("Whatever")是cshtml文件中唯一的一行,那么页面加载需要很长时间。在其前面或后面添加一个换行符(或任何内容)可以解决此问题,并且使用等效的RenderPartial方法不会出现此问题。 - General Grievance

91

将@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);
}

3
你是说Html.Partial比Html.RenderPartial性能更好? - numaroth
19
是和否,Html.Partial 在页面中即时渲染,资源占用较少但时间消耗较大。Html.RenderPartial 单独渲染,因此更快,但资源占用较多。如果您有高流量峰值,请使用 Html.Partial 以减少资源使用。如果流量变化不频繁,请选择 Html.RenderPartial。 - CodeBon
4
在我看来,恰好相反:RenderPartial的性能肯定更好,因为它直接写入输出流。Partial内部调用了相同的方法,但是写入一个StringWriter中并返回为MvcHtmlString,最终再写入输出流,因此会分配更多的内存。 - slfan
2
@BrettJones你所说的“资源密集型”是什么意思?仅仅因为Partial渲染到缓冲区并不意味着它是异步渲染的——相反,我无法理解你如何声称RenderPartial是“更加资源密集型”的。 - Dai

73

以下是我的发现:

如果您没有模型需要发送到视图,并且需要返回许多HTML而不需要将其存储在变量中,那么请使用RenderAction

如果您没有模型需要发送到视图,并且需要返回一小段文本并将其存储在变量中,请使用Action

如果您有一个模型需要发送到视图,并且有很多HTML不需要存储在变量中,请使用RenderPartial

如果您有一个模型需要发送到视图,并且需要存储一小段文本,请使用Partial

RenderActionRenderPartial更快。


2
回答“为什么?”是最好的答案,所以这对我来说是最好的。 - YEH
@David是否可以详细说明一下如果正在使用[OutputCache],应该使用什么?我有一种直觉,如果涉及缓存,则Action / RenderAction是正确的选择,因为它们确实尊重[OutputCache](与Partial / RenderPartial形成对比,后者完全忽略它,从而影响性能)。不过我可能错了。 - XDS

55

第一个返回一个MvcHtmlString,而第二个(Render..)直接输出到响应中。


MvcHtmlString也会被添加到响应中吗? - Kid
Shad,Html.Partial() 方法返回 MvcHTMLString,该字符串将由 Razor 视图引擎用于向响应正文添加内容。 - Johnny

25

@Html.Partial@Html.RenderPartial用于当你的部分视图模型与父模型对应时,无需创建任何操作方法即可调用此视图。

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


3
好的回答,因为您还解释了何时使用Partial而不是Action。 - raklos

23
根据我的观察,@Html.RenderPartial()@Html.Partial() 执行更快,这是因为 Html.RenderPartial 能够快速响应输出。 因为当我使用@Html.Partial() 时,与 @Html.RenderPartial() 相比,我的网站加载时间更长。

16

更多关于问题的信息:

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

摘自《Professional ASP.NET MVC 1.0》中的“NerdDinner”章节。


12

区别:

  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() 相关的两个常见面试问题:

何时使用 Partial()RenderPartial()

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

哪一个性能更好?

从性能的角度来看,直接渲染到输出流中会更好。RenderPartial() 恰好做到这一点,并且对于性能而言优于 Partial()


11

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

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


10

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.PartialHtml.RenderPartial


我如何使用Html.RenderPartial来实现这个? - xatz
1
我们不能使用Html.RenderPartial,因为它的返回类型是void。 - Namrata Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接