【问题标题】:Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderActionHtml.Partial 与 Html.RenderPartial 和 Html.Action 与 Html.RenderAction
【发布时间】:2011-07-12 00:22:21
【问题描述】:

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

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

【问题讨论】:

标签: .net asp.net-mvc partial-views renderpartial renderaction


【解决方案1】:

Html.Partial 返回一个字符串。 Html.RenderPartial 在内部调用 Write 并返回 void

基本用法是:

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

// WebView syntax
<%: Html.Partial("ViewName") %>
<% Html.RenderPartial("ViewName"); %>

在上面的 sn-p 中,两个调用都会产生相同的结果。

虽然可以将Html.Partial 的输出存储在变量中或从方法中返回,但不能使用Html.RenderPartial

结果将在执行/评估期间写入Response 流。

这也适用于Html.ActionHtml.RenderAction

【讨论】:

  • 你知道为什么你会使用一个而不是另一个吗?
  • 在性能方面,最好使用 RenderPartial,如下所示:stackoverflow.com/questions/2729815/…
  • 感谢您将结果存储到变量中。这就是在 Render 对应物上使用 Partial 或 Action 的原因。
  • Html.Partial() 的创建是为了在 Razor 中使用更流畅的语法。正如@Vlad 所说,Html.RenderPartial() 效率更高。
  • @Tsahi 解释了为什么在 _LoginPartial 的 MVC 项目模板中使用它。谢谢。
【解决方案2】:

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

【讨论】:

  • 你是说 Html.Partial 的性能比 Html.RenderPartial 好?
  • 是与否,Html.Partial 是内联渲染的,占用资源较少,但耗时较多。 Html.RenderPartial 是单独渲染的,因此速度更快,但更占用资源。如果您有大量突发流量,请使用 Html.Partial 以减少资源使用。如果您的流量变化不频繁,请使用 Html.RenderPartial。
  • 在我看来,情况正好相反:RenderPartial 直接写入输出流时性能肯定更好。 Partial 内部调用相同的方法,但写入 StringWriter,后者作为 MvcHtmlString 返回并最终写入输出流。因此它分配了更多的内存。
  • @BrettJones “资源密集型”是什么意思?仅仅因为Partial 渲染到缓冲区并不意味着它是异步渲染的——恰恰相反——我看不出你怎么能声称RenderPartial 是“资源密集型”。
【解决方案3】:

这是我发现的:

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

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

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

当你有一个模型要发送到视图并且会有一点文本需要存储在一个变量中时,使用 Partial

RenderActionRenderPartial 更快。​​

【讨论】:

  • 回答(为什么?)是最好的答案,所以这对我来说是最好的。
  • @David 会很乐意详细说明如果使用 [OutputCache] 时要使用什么?我有一种直觉,如果涉及缓存,那么 Action / RenderAction 是要走的路,因为它们确实尊重 [OutputCache](与 Partial / RenderPartial 完全忽略它从而损害性能相反)。不过我可能错了。
【解决方案4】:

不同之处在于第一个返回 MvcHtmlString 而第二个 (Render..) 直接输出到响应。

【讨论】:

  • 不会也将 MvcHtmlString 添加到响应中吗?
  • Shad, Html.Partial() 方法返回 MvcHTMLString,razor 视图引擎将使用该字符串将内容添加到响应正文中。
【解决方案5】:

@Html.Partial@Html.RenderPartial用于当你的Partial view model是parent model的对应时,我们不需要创建任何action方法来调用它。

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

【讨论】:

  • 很好的答案,因为您还解释了何时使用 Partial over Action
【解决方案6】:

据我所知,@Html.RenderPartial() 的执行速度比@Html.Partial() 快,因为 Html.RenderPartial 对输出提供了快速响应。

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

【讨论】:

    【解决方案7】:

    关于这个问题的更多信息:

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

    Professional ASP.NET MVC 1.0 中的“NerdDinner”

    【讨论】:

      【解决方案8】:

      Html.RenderAction 的返回类型为void,即直接在 View 中渲染响应,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 做到这一点?
      • 我们不能使用 Html.RenderPartial 因为它的返回类型是 void
      【解决方案9】:

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

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

      【讨论】:

        【解决方案10】:

        区别:

        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个常见面试问题 你什么时候会使用Partial() 而不是RenderPartial(),反之亦然?

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

        哪个性能更好?

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

        【讨论】:

          【解决方案11】:

          Html.Partial: 返回MvcHtmlString 并且很慢

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

          【讨论】:

            【解决方案12】:

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

            PartialView 的语法:

             [HttpGet] 
             public ActionResult AnyActionMethod
             {
                 return PartialView();
             }
            

            【讨论】:

              【解决方案13】:

              对于“部分”,我总是这样使用它:

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

              如果您有一个“静态”包含,它本身没有链接到控制器,并且只是在“共享”文件夹中,例如,使用“HTML.partial”

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-08-14
                • 2011-02-26
                • 2012-07-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多