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

93

Quelle est la manière appropriée de rendre un modèle enfant?

Et quelle est la différence? Les deux semblent fonctionner pour moi.

Et pourquoi ne @Html.RenderPartial()fonctionne plus?

Evgenyt
la source

Réponses:

127
Html.Partial("MyView")

Rend la vue "MyView" en un fichier MvcHtmlString. Il suit les règles standard pour la recherche de vue (c.-à-d. Vérifier le répertoire courant, puis vérifier le Sharedrépertoire).

Html.RenderPartial("MyView")

Fait la même chose que Html.Partial(), sauf qu'il écrit sa sortie directement dans le flux de réponse. C'est plus efficace, car le contenu de la vue n'est pas mis en mémoire tampon. Cependant, comme la méthode ne renvoie aucune sortie, @Html.RenderPartial("MyView")ne fonctionnera pas. Vous devez envelopper l'appel dans un bloc de code à la place: @{Html.RenderPartial("MyView");}.

RenderPage("MyView.cshtml")

Rend la vue spécifiée (identifiée par chemin et nom de fichier plutôt que par nom de vue) directement dans le flux de réponse, comme Html.RenderPartial(). Vous pouvez fournir n'importe quel modèle que vous aimez à la vue en l'incluant comme deuxième paramètre

RenderPage("MyView.cshtml", MyModel)
Annabelle
la source
8
Existe-t-il des mesures sur le gain d'efficacité de @ {Html.RenderPartial ("MyView");} sur @ Html.RenderPartial ("MyView")?
Faust
@Faust vouliez-vous dire Partial vd RenderPartial?
Cacho Santa
1
@cacho: oui, mon commentaire devrait se lire @Html.Partial("MyView")vs.@{Html.RenderPartial("MyView");}
Faust
2
Petite correction: le deuxième paramètre de RenderPage () n'est pas le modèle, c'est un objet param [] auquel on accède via la propriété PageData. Cela semble fonctionner comme ci-dessus car par défaut, le modèle de la page «parent» est transmis à «l'enfant». msdn.microsoft.com/en-us/library/…
Jon
Existe-t-il un moyen d'imbriquer une page complète le long de son modèle en appelant RenderPage? Je souhaite imbriquer une page différente en spécifiant un paramètre de requête spécifique, qui à son tour filtrerait les données de cette page et, en outre, supprimerait sa propre mise en page.
Shimmy Weitzhandler
17

je préfère

@RenderPage("_LayoutHeader.cshtml")

Plus de

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

Seulement parce que la syntaxe est plus simple et plus lisible. À part cela, il ne semble pas y avoir de différences en termes de fonctionnalité.

EDIT: L'un des avantages de RenderPartial est que vous n'avez pas à spécifier le chemin complet ou l'extension de fichier, il recherchera automatiquement les lieux communs.

Ryan Sampson
la source
1
Je pense que cela devrait être un commentaire et non une réponse. Aussi je suis d'accord avec en RenderPageraison de la syntaxe.
Iman Mahmoudinasab
6

La méthode RenderPartial ne renvoie pas de balisage HTML comme la plupart des autres méthodes d'assistance. Au lieu de cela, il écrit le contenu directement dans le flux de réponse, c'est pourquoi nous devons l'appeler comme une ligne complète de C #, en utilisant un point-virgule.

C'est légèrement plus efficace que de mettre en mémoire tampon le HTML rendu à partir de la vue partielle, car il sera écrit dans le flux de réponse de toute façon. Si vous préférez une syntaxe plus cohérente, vous pouvez utiliser la méthode Html.Partial , qui fait exactement la même chose que la méthode RenderPartial , mais renvoie un fragment HTML et peut être utilisée comme @ Html.Partial ("Product", p).

Omid Shariati
la source
2

Nous pouvons également passer le modèle en utilisant des vues partielles. @ Html.Partial ("MyView", "MyModel");

Bayram
la source
0
@RenderPages() 

Ce qui précède ne fonctionne pas dans ASP.NET MVC. Cela ne fonctionne que dans les pages Web.

@Html.Partial("_Footer")

Vous devrez utiliser ce qui précède dans ASP.NET MVC.

Umar Aftab
la source