En ASP.NET MVC, ¿cuál es la diferencia entre:
Html.Partial
yHtml.RenderPartial
Html.Action
yHtml.RenderAction
En ASP.NET MVC, ¿cuál es la diferencia entre:
Html.Partial
y Html.RenderPartial
Html.Action
y Html.RenderAction
Respuestas:
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 arrojará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
.
Html.Partial()
fue creado para tener una sintaxis más fluida con Razor. Como dijo @Vlad, Html.RenderPartial()
es más eficiente.
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);
}
Partial
renderizado 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 RenderPartial
es "más intensivo en recursos".
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.
@Html.Partial
y @Html.RenderPartial
se 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.Action
y @Html.RenderAction
se 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.
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
El tipo de retorno de Html.RenderAction
es void
que significa que procesa directamente las respuestas en la Vista donde el tipo de retorno de Html.Action
es MvcHtmlString
Puede 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.Partial
yHtml.RenderPartial
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.
Diferencias:
El tipo de retorno de RenderPartial
es void
, donde como Partial
devuelveMvcHtmlString
Sintaxis para invocar Partial()
y RenderPartial()
métodos en vistas Razor
@ Html.Partial ("PartialViewName")
@ {Html.RenderPartial ("PartialViewName"); }
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()
.
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"
@Html.Partial
devuelve la vista en una cadena codificada en HTML y usa el mismo TextWriter
objeto de vista .
@Html.RenderPartial
Este método vuelve void
.
@Html.RenderPartial
es más rápido que@Html.Partial
La sintaxis para PartialView
:
[HttpGet]
public ActionResult AnyActionMethod
{
return PartialView();
}