ASP.NET MVC, Razor passer du modèle de mise en page
Ce que je vois, c'est une chaîne de propriété de Présentation. Mais comment puis-je passer d'un modèle de mise en page de façon explicite?
- J'ai plusieurs page avec des modèles différents, mais la même mise en page
- Cette stackoverflow question semble répondre à ce que vous demandez: stackoverflow.com/questions/13225315/...
- Je ne suis pas à avoir ce problème.
Model
est disponible dans_Layout
. Je suis en utilisant MVC5.
Vous devez vous connecter pour publier un commentaire.
Semble que vous avez modélisé votre viewmodel un peu de mal, si vous avez ce problème.
Personnellement, je ne serais jamais un type de mise en page. Mais si vous voulez le faire, vous devriez avoir une base viewmodel que vos autres viewmodel hérite de et le type de votre mise en page à la base viewmodel et vous pages spécifique à la fois.
Exemple:
Contrôleur:
Exemple en haut de la Page de Mise en Page
Maintenant, vous pouvez référencer la variable "viewModel" dans votre mise en page avec un accès complet à l'tapé objet.
J'aime cette approche, car c'est le contrôleur qui contrôle la mise en page, tandis que chaque page viewmodel restent disposition agnostique.
Notes pour MVC Core
Mvc de Base semble souffler le contenu de ViewData/ViewBag lors de l'appel de chaque action de la première fois. Ce que cela signifie, c'est que l'attribution d'ViewData dans le constructeur ne fonctionne pas. Ce qui fonctionne, cependant, est à l'aide d'un
IActionFilter
et de faire exactement le même travail dansOnActionExecuting
. MettreMyActionFilter
sur votreMyController
.c'est plutôt un truc de base, tout ce que vous devez faire est de créer une base de modèle d'affichage et assurez-vous que TOUS! et je veux dire TOUT! de votre point de vue qui ne sera jamais utiliser cette mise en page recevront des points de vue qui utilisent ce modèle de base!
dans le _Layout.cshtml:
dans l'Index (par exemple) dans la maison de contrôleur:
l'Index.cshtml:
je suis en désaccord que le passage d'un modèle à l'_layout est une erreur, quelques infos de l'utilisateur peuvent être transmises et les données peuvent être remplir dans les contrôleurs de la chaîne d'héritage, donc seulement la mise en œuvre est nécessaire.
évidemment, pour les plus avancés effet, vous devriez envisager la création d'un custom statique contaxt à l'aide de l'injection et de l'inclure modèle de l'espace de noms dans le _Layout.cshtml.
mais pour les utilisateurs de base cela fera l'affaire
Une solution commune est de faire une vue de la base du modèle qui contient les propriétés utilisées dans le fichier de layout et puis hériter du modèle de base pour les modèles utilisés sur les pages respectives.
Le problème avec cette approche est que vous avez maintenant verrouillé vous-même dans le problème d'un modèle ne peut hériter 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 avez prévu de toute façon.
Ma solution commence aussi de avec une vue de la base modèle:
Ce que je puis utiliser est une version générique de la LayoutModel qui hérite de la LayoutModel, comme ceci:
Avec cette solution, j'ai déconnecté la nécessité de disposer d'héritage entre le modèle de mise en page et le modèle.
Alors maintenant, je peux aller de l'avant et utiliser le LayoutModel dans la Mise en page.cshtml comme ceci:
Et sur une page, vous pouvez utiliser le générique LayoutModel comme ceci:
À partir de votre contrôleur vous suffit de retourner un modèle de type LayoutModel:
Pourquoi ne pas vous venez d'ajouter une nouvelle Vue Partielle avec j'propre contrôleur de passer le modèle requis pour la vue partielle et enfin Rendre le mentionné vue partielle sur votre Mise en page.cshtml à l'aide de RenderPartial ou RenderAction ?
J'utilise cette méthode pour montrer à l'utilisateur des informations comme le nom , la photo de profil et etc.
une vieille question, mais juste pour parler de la solution pour MVC5 les développeurs, vous pouvez utiliser le
Model
propriété de même que dans la vue.La
Model
propriété dans à la fois la vue et la mise en page est assosiated avec la mêmeViewDataDictionary
objet, de sorte que vous n'avez pas à faire tout un travail supplémentaire pour passer votre modèle 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 de l'intelliSense contexte de menu ne s'affichera pas car laModel
ici est un objet dynamique tout commeViewBag
.Peut-être qu'il n'est pas techniquement la bonne façon de le gérer, mais la plus simple et la plus raisonnable pour moi, la solution est de simplement faire une de la classe et de l'instancier dans la mise en page. Il s'agit d'une exception à la sinon bonne façon de le faire. Si cela se fait plus que dans la mise en page, puis vous avez besoin de repenser sérieusement de ce que vous faites et peut-être lire un peu plus de tutoriels avant de progresser plus loin dans votre projet.
puis dans la vue
dans .net core, vous pouvez même sauter et utiliser l'injection de dépendance.
Il est l'un des domaines qui est une sorte de l'ombre. Mais compte tenu de la très plus compliqué solutions de rechange que je vois ici, je pense que c'est plus qu'une ok exception à faire au nom de la praticité. Surtout si vous assurez-vous de garder les choses simples et assurez-vous tout lourd logique (je dirais qu'il y a vraiment ne devrais pas être tout, mais les exigences diffèrent) est dans une autre catégorie ou de la couche où il appartient. C'est certainement mieux que de polluer TOUS vos contrôleurs ou des modèles pour l'amour d'un seul point de vue..
Supposons que votre modèle est une collection d'objets (ou peut-être un objet unique). Pour chaque objet dans le modèle, procédez de la manière suivante.
1) Placez l'objet que vous souhaitez afficher dans le ViewBag. Par exemple:
2) Ajouter une instruction d'utilisation en haut de _Layout.cshtml qui contient la définition de classe pour vos objets. Par exemple:
@utilisant YourApplication.YourClasses;
3) Lorsque vous faites référence à yourObject dans _Layout de voter pour elle. Vous pouvez appliquer le plâtre à cause de ce que vous avez fait dans (2).
Utilisation IContainsMyModel dans votre mise en page.
Résolu. Les Interfaces de la règle.
Par exemple
Lire plus au sujet de la nouvelle @modèle directive