Ce que je vois, c'est une propriété de disposition de chaîne. Mais comment puis-je passer explicitement un modèle à la propriété Layout ?
Réponses
Trop de publicités?Vieille question mais juste pour mentionner la solution pour les développeurs MVC5, vous pouvez utiliser l'option Model
propriété identique à celle de la vue.
En Model
dans la vue et la disposition est associée à la même propriété. ViewDataDictionary
vous n'avez donc pas à faire de travail supplémentaire pour transmettre votre modèle à la page de présentation, et vous n'avez pas à déclarer les objets @model MyModelName
dans la mise en page.
Mais remarquez que lorsque vous utilisez @Model.XXX
dans la mise en page, le menu contextuel intelliSense n'apparaîtra pas parce que le bouton Model
est un objet dynamique, tout comme ViewBag
.
Peut-être que ce n'est pas techniquement la bonne façon de procéder, mais la solution la plus simple et la plus raisonnable pour moi est de créer une classe et de l'instancier dans le layout. Il s'agit d'une exception ponctuelle à la bonne manière de procéder. Si vous le faites plus souvent que dans le layout, vous devez sérieusement repenser ce que vous faites et peut-être lire quelques tutoriels de plus avant d'avancer dans votre projet.
public class MyLayoutModel {
public User CurrentUser {
get {
.. get the current user ..
}
}
}
puis dans la vue
@{
// Or get if from your DI container
var myLayoutModel = new MyLayoutModel();
}
dans .net core, il est même possible de sauter cette étape et d'utiliser l'injection de dépendances.
@inject My.Namespace.IMyLayoutModel myLayoutModel
C'est l'une de ces zones qui est plutôt ombragée. Mais compte tenu des solutions extrêmement compliquées que je vois ici, je pense qu'il s'agit d'une exception plus qu'acceptable au nom de l'aspect pratique. Surtout si l'on veille à rester simple et à s'assurer que toute logique lourde (je dirais qu'il ne devrait pas y en avoir, mais les exigences diffèrent) se trouve dans une autre classe/couche, là où elle doit se trouver. C'est certainement mieux que de polluer TOUS vos contrôleurs ou modèles pour le bien d'une seule vue
Il existe une autre façon de l'archiver.
-
Juste implémenter la classe BaseController pour tous les contrôleurs .
-
Dans le cadre de la
BaseController
créer une méthode qui renvoie une classe de modèle, comme par exemple.
public MenuPageModel GetTopMenu() { var m = new MenuPageModel(); // populate your model here return m; }
- Et dans le
Layout
vous pouvez appeler cette méthodeGetTopMenu()
@using GJob.Controllers <header class="header-wrapper border-bottom border-secondary"> <div class="sticky-header" id="appTopMenu"> @{ var menuPageModel = ((BaseController)this.ViewContext.Controller).GetTopMenu(); } @Html.Partial("_TopMainMenu", menuPageModel) </div> </header>
Pour compléter la réponse de @Mattias Jakobsson, voici le lien qui explique pourquoi nous devrions utiliser RenderAction pour les pages de mise en page.
Quand utiliser Html.RenderPartial et Html.RenderAction dans les vues Razor de ASP.NET MVC ?