web-dev-qa-db-fra.com

Modifier la disposition (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 mise en page (page maître) pour votre vue, ou laisser le choix 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 disposition sur les vues? et comment puis-je le changer?

43
Saeid

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 ajouter un nouvel élément de mise en page en haut des pages de vue cible dans @{} bloquez comme suit pour modifier la mise en page d'une page spécifique:

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

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 par une mise en page différente

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

Vous pouvez également le stocker dans la mise en page de base (_ViewStart.cshtml), puis toutes vos vues utiliseront cette disposition.

21
Chuck Norris

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

Dans la vue

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

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

Dans _ViewStart.cshtml

MVC 3 ajouté une valeur par défautViews/_ViewStart.cshtml Dans lequel vous pouvez mettre 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 Vues pour une logique personnalisée supplémentaire (il recherchera la hiérarchie et dans les dossiers Shared, tout comme lors de la recherche d'une autre vue ou partielle).

Mettre beaucoup de logique commerciale dans cela ressemble à une violation du principe de "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 WebPage , donc ses propriétés peuvent être légèrement différentes de ce à quoi vous êtes habitué (par exemple, vous devez passer par ViewContext pour obtenir le ViewBag).

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

Dans l'action Contrôleur

La méthode View() a une surcharge qui prend une page de mise en page explicite (Intellisense la désigne comme une "page maître"):

    public ActionResult FooAction()
    {
        var model = new MyModel();

        return View("Index", "_CustomLayout", model);
    }
19
Toby J

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

@{
 var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();

 string layout = "";
 if (controller == "Admin")
 {
 layout = "~/Views/Shared/_AdminLayout.cshtml";
 }
 else
 {
 layout = "~/Views/Shared/_Layout.cshtml";
 }

 Layout = layout;
}
7
Jithesh Chandra