web-dev-qa-db-fra.com

Forcer toutes les zones à utiliser la même disposition

J'ai la structure de projet suivante:

  • / Vues/Partagé/_Layout;

  • / Areas/Area1/Views/ControllerName/Index;

...

  • / Areas/AreaN/Views/ControllerName/Index.

Existe-t-il un moyen de forcer toutes les zones à utiliser la _ Disposition comme une disposition de base ?

Existe-t-il un moyen de le faire sans ajouter le fichier _ ViewStart (par exemple, via la configuration de routage)?

Voir aussi:

Comment spécifier différentes dispositions dans le fichier ViewStart du rasoir ASP.NET MVC 3?

79
Mikhail

Il vous suffit d'ajouter un fichier nommé:

_ViewStart.cshtml

Sous chaque dossier de vues de zone:

/Areas/Area1/Views/_ViewStart.cshtml

Et modifiez le fichier pour pointer vers la disposition racine comme ceci:

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

Pour que cela fonctionne, vous n'avez pas besoin de spécifier une valeur dans la propriété de mise en page de la vue, si vous le faites, vous remplaceriez la mise en page globale

Remarque: comme Tony l'a mentionné, vous pouvez modifier la propriété de disposition de chaque vue pour pointer vers la disposition racine, mais ce n'est pas la façon recommandée de le faire puisque vous serait de coupler vos points de vue avec votre mise en page et de changer ce serait douloureux

Modifier 1

Si vous souhaitez utiliser du code pour définir la disposition de la vue par défaut, vous devriez peut-être envisager d'écrire un moteur de vue personnalisé.

Essayez de google sur les RazorViewEngine et RazorView personnalisés _

Cet article pourrait être un bon point de départ

http://weblogs.asp.net/imranbaloch/archive/2011/06/27/view-engine-with-dynamic-view-location.aspx

Je n'ai pas fait quelque chose comme ça mais j'espère que je vous pointe dans la bonne direction

144
Jupaol

Élargir la réponse de Jupaol ....

Au moins dans VS2013, le fichier _ViewStart.cshtml est ajouté par défaut lors de la création de la zone, il est donc déjà là, et vous pouvez modifier le contenu comme il le note pour pointer vers la racine _Layout.cshtml. Vous pouvez ensuite supprimer le _Layout.cshtml dans la zone, car il n'est plus utilisé (et une source potentielle de confusion maintenant)

Cependant, ce faisant, tout routage effectué dans cette racine _Layout.cshtml devra prendre en compte les zones.
Le fichier _Layout.cshtml par défaut contient un certain nombre d'assistants ActionLink qui nécessitent une légère modification:

Ajoutez le paramètre RouteValueDictionary à tous les appels ActionLink en définissant Area = "". Notez que la chaîne vide fait référence au niveau racine. Cela permettra à ces liens de fonctionner correctement lorsqu'ils sont invoqués depuis une zone, tout en fonctionnant lorsqu'ils sont invoqués depuis la racine.

par exemple.:

<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
20
Rob Campbell

Vous spécifiez une mise en page en utilisant:

@ {Layout = "_Layout"; }

Si vous voulez que cela soit plus facile à changer d'un coup. Peut-être pourriez-vous simplement la définir comme une variable de sac de vue et la transmettre au contrôleur. Pour le rendre encore plus facile, vous pouvez créer un contrôleur de base dont les autres contrôleurs héritent et lui attribuer la disposition au sac de visualisation.

Je ne sais pas pourquoi le routage devrait changer ou peut-être que je ne comprends pas. J'espère que cela t'aides :)

2
Tony