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 le _Layout comme disposition de base ?
Existe-t-il un moyen de le faire sans ajouter le fichier _ViewStart (par exemple, via la configuration de routage)?
Voir également:
Comment spécifier différentes dispositions dans le fichier ViewStart du rasoir ASP.NET MVC 3?
Réponses:
Il vous suffit d'ajouter un fichier nommé:
_ViewStart.cshtml
Sous chaque dossier de vues de zone:
Et modifiez le fichier pour qu'il pointe 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 remplacez la mise en page globale
Remarque: comme Tony l'a mentionné, vous pouvez modifier la propriété de mise en page de chaque vue pour qu'elle pointe vers la mise en page racine, mais ce n'est pas la manière recommandée de le faire car vous coupleriez vos vues avec votre mise en page et la modifier serait pénible
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 rechercher sur Google la personnalisation
RazorViewEngine
etRazorView
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
la source
_ViewStart
directement dans le dossier Zone pour l'appliquer à toutes les zones.Développant 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 des zones.
Le _Layout.cshtml par défaut a un certain nombre d'aides 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 appelés à partir d'une zone, mais fonctionnent toujours lorsqu'ils sont appelés à partir de la racine.
par exemple:
<li>@Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)</li>
la source
Vous spécifiez une mise en page en utilisant:
@ {Layout = "_Layout"; }
Si vous souhaitez rendre cela plus facile à modifier en une seule fois. Peut-être que vous pouvez simplement le définir comme variable de sac de vue et le transmettre au contrôleur. Pour rendre les choses encore plus faciles, vous pouvez créer un contrôleur de base dont les autres contrôleurs héritent et lui assigner la disposition au sac de vue.
Je ne sais pas pourquoi le routage devrait changer ou peut-être que je ne comprends pas. J'espère que cela t'aides :)
la source