Forcer toutes les zones à utiliser la même disposition

88

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?

Mikhail
la source
Voici une bonne réponse et une autre
Rafael Emshoff

Réponses:

155

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 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 RazorViewEngineetRazorView

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

Jupaol
la source
1
Existe-t-il un moyen de le faire sans ajouter le fichier "_ViewStart" (par exemple, via la configuration de routage)?
Mikhail
2
Dans le routage, je ne pense pas. Ce sont deux choses différentes. Le routage est en charge d'essayer de faire correspondre l'URL de la demande actuelle avec une route enregistrée dans le RoutesTable, lorsqu'une correspondance est trouvée, un IMvcRouteHandler est créé, puis un IHttpHandler (MvcHandler) est chargé de traiter l'action de votre contrôleur. Comme vous pouvez le voir, cela n'a rien à voir avec les vues ni les mises en page. En effet, une route ne renvoie pas nécessairement une vue, elle peut renvoyer json ou xml. Le routage n'est donc pas le bon endroit pour implémenter quelque chose comme ça.
Jupaol
Vous pouvez également ajouter le _ViewStartdirectement dans le dossier Zone pour l'appliquer à toutes les zones.
Artur le
21

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>
Rob Campbell
la source
2

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 :)

Tony
la source