Modifier la présentation (page maître) de la vue dans ASP.NET MVC sans la recréer

J’utilise ASP.NET MVC 3 avec des vues Razor. Lorsque vous souhaitez créer une vue, vous pouvez choisir une présentation (page maître) pour votre vue ou la laisser choisir par défaut (_Layout).

Je suis intéressé à changer cette disposition après avoir créé une vue sans la recréer, y a-t-il un endroit où stocker les informations de mise en page sur les vues? et comment puis-je le changer?

Dans MVC3, vous avez _ViewStart.cshtml qui stocke la mise en page de toutes les pages; vous pouvez modifier cet élément pour modifier la mise en page de toutes les pages ou vous pouvez append un nouvel élément de mise en page en haut des pages de la vue cible dans le bloc @{} pour modifier la disposition de la page spécifique:

 @{ Layout = "~/Views/Shared/_newLayout.cshtml"; ViewBag.Title = "Index"; } 

Après avoir créé votre vue en haut du fichier cshtml, vous pouvez voir votre mise en page incluse.

 @{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

Vous pouvez simplement remplacer cela par exemple avec une disposition différente

 @{ Layout = "~/Views/Shared/_Layout2.cshtml"; } 

En outre, vous pouvez stocker cela dans la mise en page de base ( _ViewStart.cshtml ) et toutes vos vues utiliseront cette disposition.

Il existe plusieurs façons de spécifier une disposition différente pour une vue, en fonction de vos besoins:

Dans la vue

Comme mentionné dans d’autres réponses, modifiez simplement la propriété Layout la vue:

 @{ Layout = "~/Views/Shared/_CustomLayout.cshtml"; } 

Dans _ViewStart.cshtml

MVC 3 a ajouté un Views/_ViewStart.cshtml par Views/_ViewStart.cshtml dans lequel vous pouvez placer une logique partagée par toutes les vues. Vous pouvez également créer des fichiers _ViewStart.cshtml supplémentaires dans n’importe quel sous-répertoire Views pour une logique personnalisée supplémentaire (il recherchera la hiérarchie et Shared dossiers Shared , comme pour toute autre vue ou partielle).

Intégrer beaucoup de logique métier dans ce processus semble être une violation du principe de la «séparation des préoccupations», mais en même temps, cela peut être très pratique.

Notez que _ViewStart.cshtml hérite de StartPage , pas de WebPage , donc ses propriétés peuvent être légèrement différentes de celles auxquelles vous êtes habitué (par exemple, vous devez passer par ViewContext pour obtenir ViewBag ).

 @{ if (ViewContext.ViewBag.IsAdmin) // or other custom logic { Layout = "~/Views/Shared/_AdminLayout.cshtml"; } else { Layout = "~/Views/Shared/_Layout.cshtml"; } } 

Dans l’action du contrôleur

La méthode View() a une surcharge qui prend une page de mise en page explicite (Intellisense l’appelle une “page maître”):

  public ActionResult FooAction() { var model = new MyModel(); return View("Index", "_CustomLayout", model); } 

Nous pouvons changer le rendu par défaut des mises en page avec le fichier _ViewStart en utilisant le code ci-dessous:

 @{ var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToSsortingng(); ssortingng layout = ""; if (controller == "Admin") { layout = "~/Views/Shared/_AdminLayout.cshtml"; } else { layout = "~/Views/Shared/_Layout.cshtml"; } Layout = layout; }