Html.Partial vs Html.RenderPartial & Html.Action vs Html.RenderAction

Respuestas:

1237

Html.Partialdevuelve una cadena. Html.RenderPartialllama Writeinternamente y regresa void.

El uso básico es:

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

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

En el fragmento anterior, ambas llamadas arrojarán el mismo resultado.

Si bien se puede almacenar la salida de Html.Partialen una variable o devolverla desde un método, no se puede hacer esto con Html.RenderPartial.

El resultado se escribirá en la Responsesecuencia durante la ejecución / evaluación.

Esto también se aplica a Html.Actiony Html.RenderAction.

GvS
fuente
71
¿Sabes por qué usarías uno sobre el otro?
Jason
156
en cuanto al rendimiento, es mejor usar RenderPartial, como se responde aquí: stackoverflow.com/questions/2729815/…
Vlad Iliescu
13
Gracias por el bit sobre el almacenamiento de resultados en una variable. Esta es la razón para usar Parcial o Acción sobre la contraparte de Render.
David Kassa
8
Html.Partial()fue creado para tener una sintaxis más fluida con Razor. Como dijo @Vlad, Html.RenderPartial()es más eficiente.
Tsahi Asher
2
@Tsahi que explica por qué se usa en la plantilla de proyecto MVC para _LoginPartial. Gracias.
regularmike
86

Piense en @ Html.Partial como código HTML copiado en la página principal. Piense en @ Html.RenderPartial como un control de usuario .ascx incorporado en la página principal. Un control de usuario .ascx tiene muchos más gastos generales.

'@ Html.Partial' devuelve una cadena codificada en html que se construye en línea con el padre. Accede al modelo de los padres.

'@ Html.RenderPartial' devuelve el equivalente de un control de usuario .ascx. Obtiene su propia copia de ViewDataDictionary de la página y los cambios realizados en ViewData de RenderPartial no afectan a ViewData de los padres.

Usando la reflexión encontramos:

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);
}
Brett Jones
fuente
3
¿Estás diciendo que Html.Partial tiene mejor rendimiento que Html.RenderPartial?
numaroth
15
Sí y no, Html.Partial se procesa en línea y requiere menos recursos pero consume más tiempo. Html.RenderPartial se representa por separado y, por lo tanto, es más rápido, pero requiere más recursos. Si tiene tráfico de ráfaga de alto volumen, favorezca Html.Partial para reducir el uso de recursos. Si tiene cambios poco frecuentes en el volumen de tráfico, favor de Html.RenderPartial.
Brett Jones
44
En mi opinión, es al revés: RenderPartial definitivamente tiene un mejor rendimiento, ya que escribe directamente en la secuencia de salida. Parcialmente llama internamente al mismo método, pero escribe en un StringWriter que se devuelve como MvcHtmlString y finalmente se escribe en la secuencia de salida. Por lo tanto, asigna mucha más memoria.
slfan
2
@BrettJones ¿Qué quieres decir con "uso intensivo de recursos"? El hecho de que el Partialrenderizado en un búfer no signifique que se renderice de forma asincrónica, sino todo lo contrario, no puedo ver cómo puede afirmar que RenderPartiales "más intensivo en recursos".
Dai
57

Esto es lo que he encontrado:

Use RenderAction cuando no tenga un modelo para enviar a la vista y tenga una gran cantidad de HTML para recuperar que no necesita almacenarse en una variable.

Use Acción cuando no tenga un modelo para enviar a la vista y tenga un poco de texto para recuperar que debe almacenarse en una variable.

Use RenderPartial cuando tenga un modelo para enviar a la vista y habrá una gran cantidad de HTML que no necesita almacenarse en una variable.

Use Parcial cuando tenga un modelo para enviar a la vista y habrá un poco de texto que debe almacenarse en una variable.

RenderAction y RenderPartial son más rápidos.

David
fuente
2
Responder (¿Por qué?) Es la mejor respuesta, así que es la mejor para mí.
55

La diferencia es que primero se devuelve una salida MvcHtmlStringpero segunda ( Render..) directamente a la respuesta.

Aliostad
fuente
¿no se agregaría MvcHtmlString a la respuesta también?
Sábado
21

Según yo, @Html.RenderPartial()tiene una ejecución más rápida que @Html.Partial()debido a Html.RenderPartial da una respuesta rápida a Output.

Porque cuando uso @Html.Partial(), mi sitio web tarda más en cargarse en comparación con @Html.RenderPartial()

iChirag
fuente
21

@Html.Partialy @Html.RenderPartialse utilizan cuando su modelo de vista parcial es correspondencia del modelo principal, no necesitamos crear ningún método de acción para llamarlo.

@Html.Actiony @Html.RenderActionse usan cuando su modelo de vista parcial es independiente del modelo principal, básicamente se usa cuando desea mostrar cualquier tipo de contenido de widget en la página. Debe crear un método de acción que devuelva un resultado de vista parcial mientras llama al método desde la vista.

Jayesh Patel
fuente
3
Buena respuesta, porque también explica cuándo usar Parcial sobre Acción
raklos
15

Más sobre la pregunta:

"Cuando se llama a Html.RenderPartial () con solo el nombre de la vista parcial, ASP.NET MVC pasará a la vista parcial los mismos objetos del diccionario Modelo y ViewData utilizados por la plantilla de vista de llamada".

"NerdDinner" de Professional ASP.NET MVC 1.0

Ygor Thomaz
fuente
9

El tipo de retorno de Html.RenderActiones voidque significa que procesa directamente las respuestas en la Vista donde el tipo de retorno de Html.Actiones MvcHtmlStringPuede capturar su vista de procesamiento en el controlador y modificarla utilizando el siguiente método

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();
        }
    }

Esto devolverá la cadena Html de la Vista.

Esto también es aplicable a Html.PartialyHtml.RenderPartial

Shivkumar
fuente
¿Cómo puedo hacer esto con Html.RenderPartial?
xatz
1
no podemos usar Html.RenderPartial porque su tipo de retorno es nulo
Namrata Jain
9

Parcial o RenderPartial: no es necesario crear un método de acción. se usa cuando los datos que se mostrarán en la vista parcial ya están presentes en el modelo de la página actual.

Acción o RenderAction: requiere un método de acción secundario. se usa cuando los datos para mostrar en la vista tienen un modelo independiente.

Añil
fuente
8

Diferencias:

  1. El tipo de retorno de RenderPartiales void, donde como PartialdevuelveMvcHtmlString

  2. Sintaxis para invocar Partial()y RenderPartial()métodos en vistas Razor

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

  3. Sintaxis para invocar Partial()y RenderPartial()métodos en vistas de formularios web

[%: Html.Partial ("PartialViewName")%]
[% Html.RenderPartial ("PartialViewName"); %]

Las siguientes son las 2 preguntas de la entrevista comunes relacionados con Partial()y RenderPartial() cuándo se usa Partial()más RenderPartial(), y viceversa?

La principal diferencia es que RenderPartial()devuelve void y la salida se escribirá directamente en la secuencia de salida, donde a medida que el Partial()método regrese MvcHtmlString, se puede asignar a una variable y manipularla si es necesario. Por lo tanto, cuando sea necesario asignar la salida a una variable para manipularla, use Partial (), o use RenderPartial ().

¿Cuál es mejor para el rendimiento?

Desde una perspectiva de rendimiento, es mejor renderizar directamente a la secuencia de salida. RenderPartial()hace exactamente lo mismo y es mejor para el rendimiento Partial().

Nazmul Hasan
fuente
5

Html.Partial: vuelve MvcHtmlStringy lento

Html.RenderPartial: renderiza / escribe directamente en la secuencia de salida y regresa, voidy es muy rápido en comparación conHtml.Partial

Navneet
fuente
3

Para "parcial" siempre lo uso de la siguiente manera:

Si hay algo que necesita incluir en una página que necesita ir a través del controlador (como lo haría con una llamada Ajax), use "Html.RenderPartial".

Si tiene una inclusión 'estática' que no está vinculada a un controlador per-se y solo en la carpeta 'compartida', por ejemplo, use "HTML.partial"

scgough
fuente
2

@Html.Partialdevuelve la vista en una cadena codificada en HTML y usa el mismo TextWriterobjeto de vista . @Html.RenderPartialEste método vuelve void. @Html.RenderPartiales más rápido que@Html.Partial

La sintaxis para PartialView:

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