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

j'aimerais avoir deux dispositions distinctes dans ma demande. Disons que l'un est pour la partie Publique du site et l'autre est pour le Membre côté.

pour la simplicité disons que toute la logique pour chacun de ces sites est enveloppé soigneusement en 2 contrôleurs distincts.

  • PublicController
  • StaffController

et qu'ils ont chacun un Layout correspondant pour tous le point de Vue sous chaque.

  • _PublicLayout.CSHTML
  • _StaffLayout.CSHTML

comment utiliser le _ViewStart.fichier cshtml pour spécifier que toutes les Vues / Actions sous "Public" utilisent le PublicLayout et tout sous "Staff" utiliser le StaffLayout?

Merci!

301
demandé sur Justin 2011-03-02 01:50:16

3 réponses

vous pouvez mettre un fichier _ViewStart.cshtml dans le dossier /Views/Public qui remplacerait le fichier par défaut dans le dossier /Views et spécifier la disposition désirée:

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

par analogie, vous pouvez mettre 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 de la restitution 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);

encore une autre possibilité est un filtre d'action personnalisé qui outrepasserait la disposition. Comme vous pouvez le voir de nombreuses possibilités pour y parvenir. À vous de choisir celui qui correspond le mieux à votre scénario.


mise à JOUR:

comme demandé dans la section commentaires voici un exemple d'un filtre d'action qui choisirait une page principale:

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 ensuite décorer un contrôleur ou une action avec cet attribut personnalisé spécifiant la mise en page que vous voulez:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}
532
répondu Darin Dimitrov 2011-03-01 23:05:54

une autre méthode consiste à définir la disposition à l'intérieur de la vue:

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

D'autres façons de faire, peut être trouvé ici , espérons que cela aide quelqu'un.

28
répondu stom 2016-10-08 11:09:44

cette méthode est la manière la plus simple pour les débutants de contrôler les mises en page ASP.NET MVC application. Nous pouvons identifier le controller et rendre les Layouts en tant que controller par, pour ce faire nous pouvons écrire notre code dans le fichier _ViewStart dans le répertoire racine du dossier Views. Voici un exemple montrant 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 ASP.NET MVC "

14
répondu Anil Sharma 2014-10-08 04:29:18