Razor MVC, où mettre des variables globales accessibles à travers la page maître, partiview et vue?
Bonjour Rasoir MVC Gourous:
Newbie question.
Arrière-plan. J'ai personnalisé l'Identité est définie dans un HttpModule avant qu'il arrive à contrôleur & vues. Pour l'utiliser, je dois faire
MyIdentity myIdentity = (MyIdentity)((GenericPrincipal)context.User).Identity;
MyComplexUser user = myIdentity.User;
//user.name //user.location //user.username //etc
Le problème est, je utiliser l'objet dans différents endroits tels que
- la disposition principale
- Certains sous niveau imbriqués les mises en
- Certains partialviews
- Certains points de vue
Cela dépend vraiment de ce que les propriétés de "MyComplexUser" objet le point de vue le besoin.
Actuellement, dans les vues, que j'ai à faire ce vraiment compliqué de moulage pour obtenir une propriété. Par exemple, si je veux le "Nom" de l'utilisateur, j'ai besoin de faire
@(((MyComplexUser)(((MyIdentity)((GenericPrincipal)contexte.De l'utilisateur).D'identité).De l'utilisateur)).Nom)
Je suppose que je pourrais le mettre dans les contrôleurs et ensuite remplir le ViewBag avec un ViewBag.MyUser bien, mais alors
- Je n'aime pas utiliser ViewBag. Je préfère les objets fortement typés
- Si j'utilise un objet fortement typé ("MyUser") pour les vues, puis j'ai populaires de tous les modèles avec un "MyUser" de la propriété. Se sent un peu sale? Comme je tiens à garder mes modèles propres et spécifiques aux points de vue qu'ils sont engagés. En outre, il devient inutilement répétitif.
- Dans des endroits comme master_layout.cshtml ou partialviews, comment accédez-vous à la "MyUser" si je les ai mis dans un contrôleur?
- Utilisation RenderAction et de construire partialviews pour chaque propriété de l'Utilisateur est un overkill?
Grâce. Encore une fois, je suis un débutant à la MVC 4, toute suggestion est grandement apprécier.
source d'informationauteur Liming
Vous devez vous connecter pour publier un commentaire.
Je vais vous expliquer une solution similaire qui fonctionne assez bien pour moi. Avec de petits changements, je croire qu'il va travailler pour vous (et d'autres, espérons-le).
Fondamentalement, nous allons utiliser héritage.
Contrôleurs de
Nous allons créer un contrôleur de base, tels que
et nous allons changer nos contrôleurs d'hériter d'elle, comme
Modèles (Viewmodel, je dois dire)
Vous avez probablement beaucoup de classes à l'intérieur de votre dossier de Modèles, droit? Ils agissent comme des Otd du contrôleur à la vue, right2?
Si vous avez répondu oui pour les deux, alors continuez à lire.
Nous allons créer un modèle de base de la classe, comme
public class BaseVM
et nous allons changer nos modèles d'hériter d'elle, commepublic class HomeIndex : BaseVM
Important: votre fichier de mise en page (
_Layout
ou que ce soit) doit être fortement typée pourBaseVM
ou un enfant de lui.Le crochet
Maintenant que tout est beautifuly tapé, nous allons utiliser le pipeline de demande en notre faveur.
Au
BaseController
, vous allez ajouter une méthode qui ressemble à ceci:OnActionExecuted
est appelé après l'exécution de l'action, mais avant le rendu de l'affichage. C'est exactement ce que nous voulons.J'espère que vous l'avez déjà. =)