327 votes

Comment puis-je spécifier différentes mises en page dans le fichier ViewStart de ASP.NET MVC 3 rasoir ?

Je voudrais avoir séparer les 2 Mises en dans ma demande. Disons que l'un est pour la partie Publique du site et l'autre est pour le Membre côté.

Pour des raisons de simplicité permet de dire que toute la logique pour chacune de ces sites est enveloppé soigneusement dans 2 contrôleurs.

  • PublicController
  • StaffController

Et qu'ils ont chacun un correspondant de Mise en page pour toutes les Afficher sous chaque.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Comment puis-je utiliser le _ViewStart.cshtml fichier pour spécifier que toutes Vue de l'Action / sous "Public" utiliser le PublicLayout et tout sous "Personnel" utiliser le StaffLayout?

Merci!

574voto

Darin Dimitrov Points 528142

Vous pourriez mettre un _ViewStart.cshtml le fichier à l'intérieur de l' /Views/Public le dossier qui l'emporterait sur celui par défaut dans l' /Views le dossier et de spécifier la mise en page souhaitée:

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

Par analogie, vous pouvez placer un autre _ViewStart.cshtml le fichier à l'intérieur de l' /Views/Staff le dossier:

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

Vous pouvez également spécifier la mise en page doit être utilisé lors du retour d'une vue à l'intérieur d'un contrôleur de l'action, mais c'est par l'action:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

Encore une autre possibilité est une action personnalisée filtre qui l'emporterait sur la mise en page. Comme vous pouvez le voir beaucoup de possibilités pour atteindre cet objectif. À vous de choisir celui qui correspond le mieux à votre scénario.


Mise à JOUR:

Comme demandé dans la section des commentaires, voici un exemple d'une action de filtre qui permettrait de choisir une page maître:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

et puis décorer d'un contrôleur ou d'une action avec cet attribut personnalisé précisant la mise en page que vous voulez:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

18voto

Anil Sharma Points 67

Cette méthode est le moyen le plus simple pour les débutants à la présentation des commandes de rendu dans votre ASP.NET application MVC. Nous pouvons identifier le contrôleur et de rendre les Mises en page que par contrôleur, pour ce faire, nous pouvons écrire notre code dans _ViewStart fichier dans le répertoire racine du dossier Vues. Voici un exemple montre comment il peut être fait.

  @{
             var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
             string cLayout = "";
            if (controller == "Webmaster") {
                  cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
                 }
               else {
                cLayout = "~/Views/Shared/_Layout.cshtml";
               }
        Layout = cLayout;
         }

Lire tout l'Article ici "Comment Rendre la Mise en page différente dans ASP.NET MVC"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X