Html.Partial与Html.RenderPartial&Html.Action与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的输出存储在一个variables中,或者将其从方法中返回,但是不能Html.RenderPartial 。 结果将在执行/评估过程中写入Responsestream。

这也适用于Html.ActionHtml.RenderAction

将@ Html.Partial想象成复制到父页面的HTML代码。 把@ Html.RenderPartial想象成一个并入父页面的.ascx用户控件。 一个.ascx用户控件有更多的开销。

'@ Html.Partial'返回一个html编码的string,与父级内联构build。 它访问父母的模型。

'@ Html.RenderPartial'返回一个.ascx用户控件的等价物。 它获取页面的ViewDataDictionary的副本,并且对RenderPartial的ViewData所做的更改不会影响父级的ViewData。

使用reflection我们发现:

 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,那么不需要存储在一个variables中就可以使用RenderAction

当你没有一个模型发送到视图,并有一点点的文本,带回需要被存储在一个variables,使用动作。

当你有一个模型发送到视图时使用RenderPartial ,并且会有很多html不需要存储在variables中。

当你有一个模型发送到视图,并且会有一些需要存储在variables中的文本时使用部分

RenderActionRenderPartial更快。

根据我@Html.RenderPartial()有更快的执行比@Html.Partial()由于Html.RenderPartial快速响应输出。

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

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

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

更多关于这个问题:

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

来自Professional ASP.NET MVC 1.0的“NerdDinner”

Html.RenderAction的返回types是void ,这意味着它直接在View中呈现响应,其中Html.Action的返回types是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(); } } 

这将返回视图的Htmlstring。

这也适用于Html.PartialHtml.RenderPartial

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

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

Html.Partial :返回MvcHtmlString并且很慢

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

区别:

  1. RenderPartial的返回types是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个常见面试问题。何时使用Partial()不是RenderPartial() ,反之亦然?

主要区别在于RenderPartial()返回void,输出将直接写入输出stream,在那里Partial()方法返回MvcHtmlString ,可以将其分配给一个variables并在需要时对其进行处理。 因此,当需要将输出分配给variables来操作它时,使用Partial(),否则使用RenderPartial()。

哪一个更好的performance?

从性能angular度来看,直接渲染到输出stream更好。 RenderPartial()完成同样的事情,性能优于Partial()

对于“部分”我总是使用它如下:

如果您需要在页面中包含某些内容(如使用Ajax调用),请使用“Html.RenderPartial”。

如果你有一个“静态”的include,那么这个包就没有和控制器本身链接,而只是在“shared”文件夹中,例如使用“HTML.partial”

@Html.Partial以HTML编码的string返回视图,并使用相同的视图TextWriter对象。 @Html.RenderPartial这个方法返回void@Html.RenderPartial@Html.Partial更快

PartialView的语法:[HttpGET] public ActionResult AnyActionMethod {return PartialView(); }