Comment définir ViewBag propriétés pour tous les points de Vue sans l'aide d'une classe de base pour les Contrôleurs?
Dans le passé, j'ai collé des propriétés communes, telles que l'utilisateur actuel, sur ViewData/ViewBag dans un mode mondiale en ayant toutes les Contrôleurs hériter d'un contrôleur de base commune.
Ce qui m'a permis d'utiliser du Cio sur le contrôleur de base et ne pas juste atteindre globale partagée de ces données.
Je me demande s'il existe une autre façon d'insérer ce genre de code dans le MVC pipeline?
Vous devez vous connecter pour publier un commentaire.
De l'onu-ont essayé par moi-même, mais vous pourriez regarder l'enregistrement de votre point de vue et puis paramétrage de l'affichage des données pendant le processus d'activation.
Parce que les vues sont enregistrées à la volée, l'enregistrement de la syntaxe de ne pas vous aider avec la connexion à la
Activated
de l'événement, vous aurez besoin de définir dans unModule
:Cela pourrait être une de ces "seul outil est un marteau"de type suggestions de moi; il y a peut être plus simple MVC-permis de façons d'obtenir à elle.
Edit: Alternes, moins de code à l'approche il suffit de fixer le Contrôleur
Edit 2: une Autre approche qui fonctionne directement à partir du contrôleur de code d'enregistrement:
Resolve
partie dee.Context.Resolve
? Je dois mentionner que je suis habitué à Ninject...La meilleure façon est d'utiliser ActionFilterAttribute et inscrire votre classe personnalisée dans votre global. asax (Application_Start)
inscrire votre classe personnalisée dans votre global. asax (Application_Start)
Alors vous pouvez l'utiliser dans tous les points de vue
Il y a aussi une autre façon
La création d'une méthode d'extension sur HtmlHelper
Alors vous pouvez l'utiliser dans tous les points de vue
MembershipService
?ViewBag
de données. J'ai dû modifier mon contrôleurs pour transmettre les données à l'aide deTempData
insteadl.OnResultExecuting
s'exécute après l'action et avant le point de vue. Pour être en mesure de mettre des données dans votre action, le changement de l'événement pourOnActionExecuting
Depuis ViewBag propriétés sont, par définition, liée à la vue de la présentation et de la lumière, la vue de la logique qui peut être nécessaire, j'aimerais créer une base de WebViewPage et définir les propriétés de la page d'initialisation. Il est très similaire à la notion d'un contrôleur de base répétée de la logique et des fonctionnalités communes, mais de votre point de vue:
Puis dans
\Views\Web.config
, définir lapageBaseType
propriété:ViewBag.Title
bien et alors la seule chose dans la mise en page est<title>@ViewBag.Title</title>
. Il ne serait pas vraiment approprié pour quelque chose comme une application de base de page vue depuis chaque point de vue est distincte, et l'affichage de base page serait de données réellement communs à l'ensemble de tous les points de vue.Brandon poste est à droite sur l'argent. Comme une question de fait, je voudrais faire un pas de plus et dire que vous devez juste ajouter vos objets communs comme propriétés de la base WebViewPage afin de ne pas avoir à jeter des éléments de la ViewBag dans chaque Vue. Je fais de mon CurrentUser configuration de cette façon.
'ASP._Page_Views_Shared__Layout_cshtml' does not contain a definition for 'MyProp' and no extension method 'MyProp' accepting a first argument of type 'ASP._Page_Views_Shared__Layout_cshtml' could be found (are you missing a using directive or an assembly reference?)
Vous pouvez utiliser un custom ActionResult:
Ou même un ActionFilter:
Avait un MVC 2 projet ouvert, mais les deux techniques s'appliquent toujours avec des changements mineurs.
Si vous voulez moment de la compilation, la vérification et l'intellisense pour les propriétés de votre point de vue, puis le ViewBag n'est pas la voie à suivre.
Envisager une BaseViewModel classe et demandez à votre autre point de vue, les modèles héritent de cette classe, par exemple:
Base ViewModel
Vue spécifique ViewModel
Maintenant afficher le code peut accéder à la propriété directement dans la vue
Vous n'avez pas de gâchis à des actions ou à changer de modèle, il suffit d'utiliser un contrôleur de base et lancer le contrôleur existant à partir de la mise en page viewcontext.
Créer un contrôleur de base avec les données communes (titre/page/localisation, etc) et l'action de l'initialisation...
Assurez-vous que chaque contrôleur utilise le contrôleur de base...
Fonte de la base existante de contrôleur de la vue dans vos
_Layout.cshml
page...Maintenant, vous pouvez vous référer aux valeurs de votre contrôleur de base à partir de votre mise en page.
J'ai trouvé l'approche suivante pour être le plus efficace et offre un excellent contrôle en utilisant la _ViewStart.chtml de fichiers et les instructions conditionnelles lorsque nécessaire:
_ViewStart:
ViewA:
Note: