Html.Partial frente a Html.RenderPartial y Html.Action frente a Html.RenderAction
En ASP.NET MVC, ¿cuál es la diferencia entre:
Html.Partial
yHtml.RenderPartial
Html.Action
yHtml.RenderAction
Html.Partial
devuelve una cadena. Html.RenderPartial
Llama Write
internamente 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 producirán el mismo resultado.
Si bien se puede almacenar la salida de Html.Partial
en una variable o devolverla desde un método, no se puede hacer esto con Html.RenderPartial
.
El resultado se escribirá en la Response
secuencia durante la ejecución/evaluación.
Esto también se aplica a Html.Action
y Html.RenderAction
.
Piense en @Html.Partial como un código HTML copiado en la página principal. Piense en @Html.RenderPartial como un control de usuario .ascx incorporado a la página principal. Un control de usuario .ascx tiene mucha más sobrecarga.
'@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 del ViewDataDictionary de la página y los cambios realizados en el ViewData de RenderPartial no afectan el ViewData del padre.
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);
}
Esto es lo que he encontrado:
Utilice RenderAction cuando no tenga un modelo para enviar a la vista y tenga mucho HTML para recuperar que no necesita almacenarse en una variable.
Utilice Acción cuando no tenga un modelo para enviar a la vista y tenga un poco de texto para recuperar que deba almacenarse en una variable.
Utilice RenderPartial cuando tenga un modelo para enviar a la vista y habrá una gran cantidad de html que no sea necesario almacenar en una variable.
Utilice Parcial cuando tenga un modelo para enviar a la vista y habrá un poco de texto que deberá almacenarse en una variable.
RenderAction y RenderPartial son más rápidos.