Ce que je vois est une propriété de mise en page de chaîne. Mais comment puis-je passer un modèle à la mise en page explicitement?
c#
.net
asp.net-mvc
razor
SibérienGuy
la source
la source
Model
est disponible en_Layout
. J'utilise MVC5.Réponses:
Il semble que vous ayez un peu mal modélisé vos modèles de vue si vous rencontrez ce problème.
Personnellement, je ne taperais jamais une page de mise en page. Mais si vous voulez faire cela, vous devriez avoir un modèle de vue de base dont vos autres modèles de vue héritent et tapez votre mise en page dans le modèle de vue de base et vous pages vers le modèle spécifique une fois.
la source
Exemple: contrôleur:
Exemple de haut de page de mise en page
Vous pouvez maintenant référencer la variable 'viewModel' dans votre page de mise en page avec un accès complet à l'objet tapé.
J'aime cette approche parce que c'est le contrôleur qui contrôle la mise en page, tandis que les modèles de vue de page individuels restent indépendants de la mise en page.
Notes pour MVC Core
Mvc Core semble épater le contenu de ViewData / ViewBag lors de l'appel de chaque action la première fois. Cela signifie que l'affectation de ViewData dans le constructeur ne fonctionne pas. Ce qui fonctionne, cependant, c'est d'utiliser un
IActionFilter
et de faire exactement le même travail dansOnActionExecuting
. MettezMyActionFilter
votreMyController
.la source
ce sont des choses assez basiques, tout ce que vous avez à faire est de créer un modèle de vue de base et de vous assurer que TOUT! et je veux dire TOUT! de vos vues qui utiliseront cette disposition recevront des vues qui utilisent ce modèle de base!
dans le _Layout.cshtml:
dans la méthode Index (par exemple) dans le contrôleur domestique:
l'index.cshtml:
Je ne suis pas d'accord pour dire que passer un modèle à _layout est une erreur, certaines informations utilisateur peuvent être transmises et les données peuvent être renseignées dans la chaîne d'héritage des contrôleurs, de sorte qu'une seule implémentation est nécessaire.
évidemment, pour des raisons plus avancées, vous devriez envisager de créer un contaxt statique personnalisé à l'aide de l'injection et d'inclure cet espace de noms de modèle dans le _Layout.cshtml.
mais pour les utilisateurs basiques, cela fera l'affaire
la source
Une solution courante consiste à créer un modèle de vue de base qui contient les propriétés utilisées dans le fichier de mise en page, puis à hériter du modèle de base aux modèles utilisés sur les pages respectives.
Le problème avec cette approche est que vous vous êtes maintenant enfermé dans le problème d'un modèle qui ne peut hériter que d'une autre classe, et peut-être que votre solution est telle que vous ne pouvez pas utiliser l'héritage sur le modèle que vous vouliez de toute façon.
Ma solution commence également par un modèle de vue de base:
Ce que j'utilise ensuite est une version générique du LayoutModel qui hérite du LayoutModel, comme ceci:
Avec cette solution, j'ai déconnecté la nécessité d'avoir un héritage entre le modèle de disposition et le modèle.
Alors maintenant, je peux continuer et utiliser le LayoutModel dans Layout.cshtml comme ceci:
Et sur une page, vous pouvez utiliser le LayoutModel générique comme ceci:
Depuis votre contrôleur, vous renvoyez simplement un modèle de type LayoutModel:
la source
Pourquoi ne pas simplement ajouter une nouvelle vue partielle avec le contrôleur spécifique de i en passant le modèle requis à la vue partielle et enfin rendre la vue partielle mentionnée sur votre Layout.cshtml en utilisant RenderPartial ou RenderAction?
J'utilise cette méthode pour afficher les informations de l'utilisateur connecté telles que le nom, la photo de profil, etc.
la source
ancienne question mais juste pour mentionner la solution pour les développeurs MVC5, vous pouvez utiliser la
Model
même propriété que dans la vue.La
Model
propriété dans la vue et la mise en page est associée au mêmeViewDataDictionary
objet, vous n'avez donc pas à faire de travail supplémentaire pour transmettre votre modèle à la page de mise en page, et vous n'avez pas à déclarer@model MyModelName
dans la mise en page.Mais notez que lorsque vous utilisez
@Model.XXX
dans la mise en page, le menu contextuel intelliSense n'apparaîtra pas carModel
ici est un objet dynamique commeViewBag
.la source
Ce n'est peut-être pas techniquement la bonne façon de le gérer, mais la solution la plus simple et la plus raisonnable pour moi est simplement de créer une classe et de l'instancier dans la mise en page. C'est une exception ponctuelle à la manière par ailleurs correcte de procéder. Si cela est fait plus que dans la mise en page, vous devez repenser sérieusement ce que vous faites et peut-être lire quelques tutoriels supplémentaires avant de progresser dans votre projet.
puis dans la vue
dans .net core, vous pouvez même ignorer cela et utiliser l'injection de dépendances.
C'est l'un de ces domaines qui est un peu ombragé. Mais étant donné les alternatives extrêmement compliquées que je vois ici, je pense que c'est plus qu'une bonne exception à faire au nom de l'aspect pratique. Surtout si vous vous assurez de garder les choses simples et de vous assurer que toute logique lourde (je dirais qu'il ne devrait vraiment pas y en avoir, mais les exigences diffèrent) se trouve dans une autre classe / couche à laquelle elle appartient. C'est certainement mieux que de polluer TOUS vos contrôleurs ou modèles pour une seule vue.
la source
Il existe une autre façon de l'archiver.
Il suffit de mettre en œuvre la classe BaseController pour tous les contrôleurs .
Dans la
BaseController
classe, créez une méthode qui renvoie une classe Model comme par exemple.Layout
page, vous pouvez appeler cette méthodeGetTopMenu()
la source
Supposons que votre modèle soit une collection d'objets (ou peut-être un seul objet). Pour chaque objet du modèle, procédez comme suit.
1) Placez l'objet que vous souhaitez afficher dans le ViewBag. Par exemple:
2) Ajoutez une instruction using en haut de _Layout.cshtml qui contient la définition de classe pour vos objets. Par exemple:
@utilisation de YourApplication.YourClasses;
3) Lorsque vous référencez votreObjet dans _Layout, lancez-le. Vous pouvez appliquer la distribution en fonction de ce que vous avez fait dans (2).
la source
Utilisez IContainsMyModel dans votre mise en page.
Résolu. Règle des interfaces.
la source
Par exemple
En savoir plus sur la nouvelle directive @model
la source