web-dev-qa-db-fra.com

Comment spécifier des mises en page différentes dans le fichier ViewStart du rasoir ASP.NET MVC 3?

Je souhaite avoir 2 mises en page distinctes dans mon application. Supposons que l'une est destinée à la section publique du site Web et l'autre au côté des membres.

Pour simplifier, disons que toute la logique de chacun de ces sites est parfaitement intégrée dans deux contrôleurs distincts.

  • PublicController
  • StaffController

Et qu'ils ont chacun une disposition correspondante pour toute la vue située sous chacun.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Comment utiliser le fichier _ViewStart.cshtml pour spécifier que toutes les vues/actions sous "Public" utilisent PublicLayout et que toutes les actions sous "Personnel" utilisent StaffLayout?

Merci!

308
Justin

Vous pouvez placer un fichier _ViewStart.cshtml dans le dossier /Views/Public qui remplacerait le fichier par défaut dans le dossier /Views et spécifier la mise en page souhaitée:

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

Par analogie, vous pouvez placer un autre fichier _ViewStart.cshtml dans le dossier /Views/Staff avec:

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

Vous pouvez également spécifier quelle disposition doit être utilisée lors du retour d'une vue à l'intérieur d'une action du contrôleur, mais c'est par action:

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

Une autre possibilité est un filtre d'action personnalisé qui remplacerait la présentation. Comme vous pouvez voir de nombreuses possibilités pour y parvenir. A vous de choisir lequel correspond le mieux à votre scénario.


MISE À JOUR:

Comme demandé dans la section commentaires, voici un exemple de filtre d'action permettant 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;
        }
    }
}

puis décorez un contrôleur ou une action avec cet attribut personnalisé en spécifiant la mise en page souhaitée:

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

Une autre méthode consiste à définir la disposition dans la vue:

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

On peut trouver plus de façons de faire ici , espérons que cela aidera quelqu'un.

29
stom

Cette méthode est le moyen le plus simple pour les débutants de contrôler le rendu des présentations dans votre application ASP.NET MVC. Nous pouvons identifier le contrôleur et rendre les Layouts comme contrôleur par. Pour ce faire, nous pouvons écrire notre code dans un fichier _ViewStart situé dans le répertoire racine du dossier Views. Voici un exemple montre comment cela 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 l'article complet ici "Comment rendre différentes mises en page dans ASP.NET MVC"

14
Anil Sharma