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


Answers:


1237

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


71
您知道为什么要在另一个上使用吗?
杰森

156
性能方面,最好使用的RenderPartial,因为在这里找到答案:stackoverflow.com/questions/2729815/...
弗拉德·伊利埃斯库

13
感谢您有关将结果存储到变量中的知识。这就是在“渲染”副本上使用“部分”或“动作”的原因。
David Kassa 2013年

8
Html.Partial()旨在使Razor的语法更加流畅。正如@Vlad所说,Html.RenderPartial()效率更高。
Tsahi Asher 2014年

2
@Tsahi解释了为什么在_LoginPartial的MVC项目模板中使用它。谢谢。
regularmike

86

将@ 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

15
是的,不是,Html.Partial是内联呈现的,资源消耗较少,但更耗时。Html.RenderPartial是单独呈现的,因此速度较快,但是会占用更多资源。如果您有大量突发流量,请使用Html.Partial来减少资源使用。如果您的流量很少更改,请使用Html.RenderPartial。
布雷特·琼斯

4
在我看来,这是另一回事:RenderPartial确实具有更好的性能,因为它直接写入输出流。内部部分调用相同的方法,但是写入StringWriter,该StringWriter作为MvcHtmlString返回,最后写入输出流。因此,它分配了更多的内存。
slfan 2017年

2
@BrettJones“资源密集型”是什么意思?仅仅因为Partial渲染到缓冲区并不意味着它是异步渲染的-恰恰相反-我看不到如何声称RenderPartial“资源更多”。

57

这是我发现的:

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

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

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

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

RenderActionRenderPartial更快。


2
回答(为什么?)是最好的答案,所以这对我来说是最好的。
YEH

55

区别在于,第一个返回响应,MvcHtmlString但第二个(Render..)输出直接返回响应。


MvcHtmlString也不会添加到响应中吗?
Shad

21

据我说,@Html.RenderPartial()它比@Html.Partial()Html.RenderPartial的执行速度更快。

因为当我使用时@Html.Partial(),与 @Html.RenderPartial()


21

@Html.Partial并且@Html.RenderPartial在您的部分视图模型是父模型的对应模型时使用,并且我们不需要创建任何操作方法来调用它。

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


3
好的答案,因为您还解释了何时使用“部分行动”
raklos 16-10-25

15

有关此问题的更多信息:

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

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


9

返回类型为Html.RenderActionis void意味着它直接在View中渲染响应,而返回类型为Html.Actionis 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,因为其返回类型为空
Namrata Jain

9

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

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


8

差异:

  1. 的返回类型RenderPartialvoid,其中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()over RenderPartial(),反之亦然?

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

哪一个性能更好?

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


5

Html.Partial:返回MvcHtmlString且缓慢

Html.RenderPartial:直接在输出流上渲染/写入并返回void,与之相比,它非常快Html.Partial


3

对于“部分”,我总是按如下方式使用它:

如果需要在页面中包含某些内容,则需要通过控制器(就像使用Ajax调用一样),然后使用“ Html.RenderPartial”。

例如,如果您有一个“静态”包含,它本身未链接到控制器,而仅位于“共享”文件夹中,请使用“ HTML.partial”


2

@Html.Partial以HTML编码的字符串返回视图,并使用相同的视图TextWriter对象。 @Html.RenderPartial此方法返回void@Html.RenderPartial@Html.Partial

的语法PartialView

 [HttpGet] 
 public ActionResult AnyActionMethod
 {
     return PartialView();
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.