Forcer toutes les zones à utiliser la même disposition

J’ai la structure de projet suivante:

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

Existe-t-il un moyen de forcer toutes les zones à utiliser le _Layout comme mise en page de base ?

Est-il possible de le faire sans append le fichier _ViewStart (par exemple, via la configuration du routage)?

Voir également:

Comment spécifier différentes mises en page dans le fichier ASP.NET MVC 3 ViewStart?

Il suffit d’append un fichier nommé:

_ViewStart.cshtml 

Sous chaque dossier de vues de zone:

 /Areas/Area1/Views/_ViewStart.cshtml 

Et éditez le fichier pour qu’il pointe sur la présentation 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é layout de la vue, si vous le faites, vous substitueriez la disposition globale

Remarque: Comme Tony l’a mentionné, vous pouvez éditer 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 méthode recommandée car vous couplerez vos vues avec votre mise en page et les modifierez.

Modifier 1

Si vous souhaitez utiliser le 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 RazorViewEngine et RazorView

Cet article pourrait être un bon sharepoint 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 dirige dans la bonne direction

Etendre la réponse par 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à présent et vous pouvez modifier le contenu en notant qu’il pointe vers la racine _Layout.cshtml. Vous pouvez alors supprimer le _Layout.cshtml dans la zone, car il n’est plus utilisé (et une source potentielle de confusion maintenant)

Cependant, tout routage effectué dans cette racine _Layout.cshtml devra prendre en compte les zones.
Le paramètre par défaut _Layout.cshtml comporte un certain nombre d’aides ActionLink nécessitant 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 depuis une zone, fonctionnent quand ils sont appelés depuis la racine.

par exemple:

 
  • @Html.ActionLink("Home", "Index", "Home", new { Area = "" }, null)
  • Vous spécifiez une mise en page à l’aide de:

    @ {Layout = “_Layout”; }

    Si vous voulez rendre cela plus facile à changer en une seule fois. Peut-être que vous pourriez simplement le définir comme variable de sac de vue et le transmettre au contrôleur. Pour vous faciliter la tâche, vous pouvez créer un contrôleur de base dont les autres contrôleurs héritent et l’affecter à la pochette 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 🙂