1
votes

Comment puis-je configurer des dispositions conditionnelles avec _ViewStart dans ASP.NET Core Razor Pages?

Je souhaite afficher différentes mises en page en fonction de la page actuelle rendue.

Je ne trouve rien en ligne à ce sujet, mais je pense que cela devrait être un cas d'utilisation extrêmement courant.

Je n'ai que quelques pages. Je souhaite attribuer des mises en page uniques à mes pages d'enregistrement et de connexion.

C'est ce que j'ai jusqu'à présent, mais je ne peux pas utiliser ControllerContext dans cette situation.

@{
    string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
    dynamic Layout;
    switch (controllerName)
    {
        case "Register":
            Layout = "_RegisterLayout";
            break;
        case "Login":
            Layout = "_LoginLayout";
            break;
        default:
            Layout = "_Layout";
            break;
    }
}

entrez la description de l'image ici


8 commentaires

Quel problème vous rencontrez avec ce code? Avez-vous une erreur?


La capture d'écran montre pourquoi il ne compile pas.


Vous pouvez définir la mise en page dans des pages individuelles au lieu d'utiliser ViewStart


Recommanderiez-vous de supprimer entièrement ViewStart et de définir à la place la mise en page sur chaque page?


Vous souhaiterez peut-être utiliser ViewStart pour d'autres pages afin de définir la mise en page pour elles tout en remplaçant la mise en page pour la page de connexion et d'enregistrement


Pouvez-vous fournir du code sur la façon de remplacer la mise en page pour différentes pages? Aussi, comment puis-je créer une nouvelle page de mise en page? Puis-je le faire en cliquant sur Ajouter> Page Razor?


Vous pouvez obtenir le nom du contrôleur dans ViewStart à l'aide de ViewContext. stackoverflow.com/questions/26415875/...


NullReferenceException: Object reference not set to an instance of an object. erreur suivante NullReferenceException: Object reference not set to an instance of an object.


4 Réponses :


2
votes

Nous avons récemment rencontré un problème similaire. Nous avons décidé de fournir le nom de la mise en page avec ViewData, voici comment.

services.AddMvc(options =>
            {
                options.Filters.Add(new SampleFilter());
            })

De cette façon, vous pouvez modifier la disposition en utilisant l'action, ou depuis l'intérieur de la vue ou en utilisant un filtre d'action. J'inclurai un filtre d'action qui effectue les opérations suivantes en utilisant le nom du contrôleur, comme vous l'avez demandé, puis vous pourrez enregistrer le filtre globalement.

    public class LayoutNameFilter : IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext context)
        {
            var result = context.Result as ViewResult;
            var controllerName = context.RouteData.Values["controller"].ToString();
            switch (controllerName)
            {
                case "Register":
                    result.ViewData["LayoutName"] = "_RegisterLayout";
                    break;
                case "Login":
                    result.ViewData["LayoutName"] = "_LoginLayout";
                    break;
                default:
                    result.ViewData["LayoutName"] = "_Layout";
                    break;
            }
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
        }
    }

Et puis vous pouvez enregistrer ce filtre globalement en remplaçant les services.AddMvc comme ça.

Layout = (string)ViewData["LayoutName"] ?? "DefaultLayout";

J'espère que cela t'aides.


1 commentaires

Je n'utilise malheureusement pas MVC.



1
votes

Pour des raisons pratiques, le fichier _ViewStart est utilisé pour définir la disposition de toutes les pages du même dossier que ViewStart et de tous ses sous-dossiers. Vous pouvez remplacer cela de plusieurs manières, mais le moyen le plus simple dans votre cas est de spécifier une valeur différente pour la propriété Layout dans la page Razor elle-même:

@page
@model MyApp.Pages.Account.LoginModel
@{
    Layout = "/path/to/login-layout.cshtml;
}
<h1>Login</h1>
...


0 commentaires

0
votes

Vous pouvez essayer avec ViewData. Dans le code suivant, j'ai changé la mise en page uniquement pour la page de contact

Contact.cshtml.cs

@{

    if (ViewData["page"] != null && !string.IsNullOrWhiteSpace(ViewData["page"].ToString()))
    {
        Layout = "_ContactLayout";
    }
    else
    {
        Layout = "_Layout";
    }
}

_ViewStart.cshtml

    public void OnGet()
    {
        ViewData["page"] = "Contact";
        Message = "Your contact page.";
    }


0 commentaires

0
votes

Essayez ceci dans le fichier _ViewStart.cshtml :

@{
    if(ViewData["Layout"] == "Layout1")
        Layout = "_Layout";
    else Layout = "_Layout2";
}

C'est un exemple qui fonctionne pour moi


0 commentaires