Razor: @ Html.Partial () vs @RenderPage ()

93

¿Cuál es la forma adecuada de representar una plantilla secundaria?

Y cual es la diferencia? Ambos parecen funcionar para mí.

¿Y por qué @Html.RenderPartial()ya no funciona?

Evgenyt
fuente

Respuestas:

127
Html.Partial("MyView")

Renderiza la vista "MyView" en un MvcHtmlString. Sigue las reglas estándar para la búsqueda de vistas (es decir, verifique el directorio actual, luego verifique el Shareddirectorio).

Html.RenderPartial("MyView")

Hace lo mismo que Html.Partial(), excepto que escribe su salida directamente en el flujo de respuesta. Esto es más eficiente porque el contenido de la vista no se almacena en la memoria. Sin embargo, debido a que el método no devuelve ningún resultado, @Html.RenderPartial("MyView")no funcionará. Usted tiene que envolver la llamada en un bloque de código en su lugar: @{Html.RenderPartial("MyView");}.

RenderPage("MyView.cshtml")

Muestra la vista especificada (identificada por la ruta y el nombre del archivo en lugar de por el nombre de la vista) directamente en el flujo de respuesta, como Html.RenderPartial(). Puede suministrar cualquier modelo que desee a la vista incluyéndolo como segundo parámetro

RenderPage("MyView.cshtml", MyModel)
Annabelle
fuente
8
¿Existe alguna métrica sobre la ganancia de eficiencia de @ {Html.RenderPartial ("MyView");} sobre @ Html.RenderPartial ("MyView")?
Fausto
@Faust ¿te referías a Partial vd RenderPartial?
Cacho Santa
1
@cacho: sí, mi comentario debe leer @Html.Partial("MyView")vs@{Html.RenderPartial("MyView");}
Faust
2
Pequeña corrección: el segundo parámetro en RenderPage () no es el modelo, es un objeto param [] al que se accede a través de la propiedad PageData. Parece funcionar como antes porque, de forma predeterminada, el modelo de la página "principal" se pasa al "hijo". msdn.microsoft.com/en-us/library/…
Jon
¿Hay alguna forma de anidar una página completa a lo largo de su modelo llamando RenderPage? Quiero anidar una página diferente especificando un parámetro de consulta específico, que a su vez filtraría los datos en esa página y, además, eliminaría su propio diseño.
Shimmy Weitzhandler
17

yo prefiero

@RenderPage("_LayoutHeader.cshtml")

Encima

@{ Html.RenderPartial("_LayoutHeader"); }

Solo porque la sintaxis es más fácil y más legible. Aparte de eso, no parece haber diferencias en cuanto a funcionalidad.

EDITAR: Una ventaja de RenderPartial es que no tiene que especificar la ruta completa o la extensión del archivo, buscará los lugares comunes automáticamente.

Ryan Sampson
fuente
1
Creo que esto debería ser un comentario, no una respuesta. También estoy de acuerdo RenderPagepor la sintaxis.
Iman Mahmoudinasab
6

El método RenderPartial no devuelve marcado HTML como la mayoría de los otros métodos auxiliares. En cambio, escribe contenido directamente en el flujo de respuesta, por lo que debemos llamarlo como una línea completa de C #, usando un punto y coma.

Esto es un poco más eficiente que almacenar en búfer el HTML renderizado desde la vista parcial, ya que se escribirá en el flujo de respuesta de todos modos. Si prefiere una sintaxis más coherente, puede utilizar el método Html.Partial , que hace exactamente lo mismo que el método RenderPartial , pero devuelve un fragmento HTML y se puede utilizar como @ Html.Partial ("Product", p).

Omid Shariati
fuente
2

También podemos pasar el modelo usando vistas parciales. @ Html.Partial ("MyView", "MyModel");

Bayram
fuente
0
@RenderPages() 

Lo anterior no funciona en ASP.NET MVC. Solo funciona en páginas web.

@Html.Partial("_Footer")

Deberá utilizar lo anterior en ASP.NET MVC.

Umar Aftab
fuente