¿Cuál es la diferencia (si la hay) entre Html.Partial (vista, modelo) y Html.RenderPartial (vista, modelo) en MVC2?

141

Aparte del tipo que devuelve y el hecho de que lo llame de manera diferente, por supuesto

<% Html.RenderPartial(...); %>
<%= Html.Partial(...) %>  

Si son diferentes, ¿por qué llamarías a uno en lugar del otro?
Las definiciones:

// Type: System.Web.Mvc.Html.RenderPartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class RenderPartialExtensions
    {
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, ViewDataDictionary viewData);
        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static void RenderPartial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                     ViewDataDictionary viewData);
    }
}

// Type: System.Web.Mvc.Html.PartialExtensions
// Assembly: System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// Assembly location: C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 2\Assemblies\System.Web.Mvc.dll

using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    public static class PartialExtensions
    {
        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName,
                                        ViewDataDictionary viewData);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model);

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model,
                                        ViewDataDictionary viewData);
    }
}
Stéphane
fuente

Respuestas:

168

La única diferencia es que Partialdevuelve un MvcHtmlString, y debe llamarse dentro <%= %>, mientras que RenderPartialdevuelve voidy representa directamente a la vista.

Si observa el código fuente , verá que ambos llaman al mismo método interno, pasando un StringWriter para que lo represente.

Llamaría Partialsi desea ver, guardar o manipular el HTML generado en lugar de escribirlo en la página.

SLaks
fuente
Ok, entonces no hay ninguno :) como pensé, creo que puedo usarlos sin problemas. Gracias :)
Stéphane
40
no, la diferencia es el tipo de retorno, como dijo SLaks. Esto no es trivial. En cuanto al rendimiento, se ha afirmado que es mejor renderizar directamente a la secuencia de salida (razón por la cual fueron con el RenderPartial vacío para empezar). Parcial es principalmente útil (imo) en las pruebas, aunque, como dijo SLaks, puede haber algunos lugares en los que desee manipular la salida antes de representarla en el código de producción. Son raros, imo.
Paul
42
Parcial también es útil cuando desea obtener la salida de una vista en el controlador. Esto se puede usar para usar una vista para formatear un correo electrónico.
Samg
3
@Paul: ¿Cuánto más rendimiento estamos hablando? ¿Los reclamos tienen alguna prueba o puntos de referencia asociados con ellos? Sería interesante ver si hay carne real para esto o si es solo una microoptimización.
Chris Pratt
1
Una pregunta que tengo es: ambos terminarían siendo procesados ​​en la secuencia de resultados independientemente de cuál use (ya que en Razor no solo lo llama enviándolo al TextWriter de la vista renderizada), si ambos llaman al mismo método interno, ¿por qué? ¿Sería uno más eficiente que el otro? ¿Se debe a que hace girar su propio búfer interno (que se expandiría progresivamente según sea necesario)? También me alegra que alguien más haya visto usar el modelo de vista para procesar correos electrónicos; otro desarrollador pensó que lo estaba haciendo demasiado, pero es más limpio y fácil de manipular que una cuerda en la que tienes que escapar de todo.
Allen Clark Copeland Jr
4

Esta es una gran explicación de Dino Esposito:

La diferencia entre los dos métodos puede parecer pequeña e inofensiva, pero puede morderte si no sabes cómo manejarlo. La diferencia clave entre los dos métodos es:

  • Partial devuelve una cadena codificada en HTML
  • RenderPartiales un método nulo que escribe directamente en la secuencia de salida de respuesta.

El uso de los dos métodos es ligeramente diferente:

@Html.Partial("_yourPartialView")
@{ Html.RenderPartial("_yourPartialView "); }

La elección de cuál usar depende de sus requisitos. Si necesita manipular más la cadena que se inyecta en la secuencia de respuesta, debe usar Partial; de lo contrario, vaya con RenderPartial cual es, solo porque va directamente a la secuencia, un poco más rápido que Partial.

Al final, los casos de uso para vistas parciales caen en cualquiera de los dos campos. La primera es cuando crea una vista componiendo varias piezas independientes de marcado, como se muestra a continuación.

<body>
    @{ Html.RenderPartial("_Header"); }
    @Html.Partial("_Sidebar")
    <div class="container body-content">
       @RenderBody()
    </div>
    @{ Html.RenderPartial("_Footer"); }
</body>

En este caso, su decisión de elegir entre RenderPartialo Partialno cambia el efecto final. Sin embargo, debido a que RenderPartiales un poco más rápido, puede preferir usarlo.

Aumentar
fuente
44
-1 Cuando copie de otra fuente, al menos dé crédito. Esta es una copia evidente palabra por palabra de Pro ASP.NET MVC 3 Framework (o al menos una edición más reciente).
Robotron