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


93

Qual è il modo appropriato per rendere un template figlio?

E qual è la differenza? Entrambi sembrano funzionare per me.

E perché non @Html.RenderPartial()funziona più?

Risposte:


127
Html.Partial("MyView")

Esegue il rendering della vista "MyView" in un file MvcHtmlString. Segue le regole standard per la ricerca delle viste (cioè controlla la directory corrente, quindi controlla la Shareddirectory).

Html.RenderPartial("MyView")

Fa lo stesso di Html.Partial(), tranne per il fatto che scrive il suo output direttamente nel flusso di risposta. Ciò è più efficiente, perché il contenuto della vista non è memorizzato nel buffer. Tuttavia, poiché il metodo non restituisce alcun output, @Html.RenderPartial("MyView")non funzionerà. Si deve avvolgere la chiamata in un blocco di codice, invece: @{Html.RenderPartial("MyView");}.

RenderPage("MyView.cshtml")

Rende la vista specificata (identificata dal percorso e dal nome del file piuttosto che dal nome della vista) direttamente nel flusso di risposta, come Html.RenderPartial(). Puoi fornire qualsiasi modello che ti piace alla vista includendolo come secondo parametro

RenderPage("MyView.cshtml", MyModel)

8
Esistono metriche sull'aumento di efficienza di @ {Html.RenderPartial ("MyView");} rispetto a @ Html.RenderPartial ("MyView")?
Faust

@ Faust, intendevi Partial vd RenderPartial?
Cacho Santa

1
@cacho: sì, il mio commento dovrebbe leggere @Html.Partial("MyView")vs.@{Html.RenderPartial("MyView");}
Faust

2
Piccola correzione: il secondo parametro in RenderPage () non è il modello, è un oggetto param [] a cui si accede tramite la proprietà PageData. Sembra funzionare come sopra perché per impostazione predefinita il modello dalla pagina "genitore" viene passato al "figlio". msdn.microsoft.com/en-us/library/…
Jon

C'è un modo per annidare una pagina completa lungo il suo modello chiamando RenderPage? Desidero annidare una pagina diversa specificando un parametro di query specifico, che a sua volta filtrerebbe i dati in quella pagina e, inoltre, rimuoverà il proprio layout.
Shimmy Weitzhandler

17

preferisco

@RenderPage("_LayoutHeader.cshtml")

Al di sopra di

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

Solo perché la sintassi è più semplice ed è più leggibile. Oltre a questo non sembra esserci alcuna differenza in termini di funzionalità.

EDIT: Un vantaggio di RenderPartial è che non è necessario specificare l'intero percorso o l'estensione del file, cercherà automaticamente i luoghi comuni.


1
Penso che questo dovrebbe essere un commento, non una risposta. Inoltre sono d'accordo con a RenderPagecausa della sintassi.
Iman Mahmoudinasab

6

Il metodo RenderPartial non restituisce il markup HTML come la maggior parte degli altri metodi di supporto. Invece, scrive il contenuto direttamente nel flusso di risposta, motivo per cui dobbiamo chiamarlo come una riga completa di C #, utilizzando un punto e virgola.

Questo è leggermente più efficiente del buffering dell'HTML renderizzato dalla vista parziale, poiché verrà comunque scritto nel flusso di risposta. Se si preferisce una sintassi più coerente, è possibile utilizzare il metodo Html.Partial , che fa esattamente la stessa cosa del metodo RenderPartial , ma restituisce un frammento HTML e può essere utilizzato come @ Html.Partial ("Product", p).


2

Possiamo anche passare il modello usando le viste parziali. @ Html.Partial ("MyView", "MyModel");


0
@RenderPages() 

Quanto sopra non funziona in ASP.NET MVC. Funziona solo nelle pagine web.

@Html.Partial("_Footer")

Sarà necessario utilizzare quanto sopra in ASP.NET MVC.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.