Comment devrais-je accéder à mon ApplicationUser propriétés à partir de l'intérieur de mon MVC 6 Vues?
Je suis en train de travailler sur un ASP.Net vNext /MVC6 projet. Je suis de se familiariser avec ASP.Net l'Identité.
La ApplicationUser
classe est apparemment là que je suis censé pour ajouter des propriétés de l'utilisateur, et cela fonctionne avec Entity Framework et mon propriétés supplémentaires sont stockés dans la base de données comme prévu.
Cependant, le problème vient quand je veux accéder aux détails de l'utilisateur actuellement connecté à partir de l'intérieur de mon point de vue. Plus précisément, j'ai un _loginPartial.cshtml
dans laquelle je veux récupérer et d'afficher à l'utilisateur de Gravatar icône, pour lequel j'ai besoin de l'adresse e-mail.
Le Rasoir View
de la classe de base a une propriété de l'Utilisateur, qui est un ClaimsPrincipal
. Comment puis-je passer de cette User
propriété de retour à mon ApplicationUser
, pour récupérer mon propriétés personnalisées?
Remarque que je ne suis pas demandant comment trouver l'information; je sais comment à la recherche d'un ApplicationUser
de la User.GetUserId()
valeur. C'est plus une question à propos de la manière d'aborder ce problème de confidentialité. Plus précisément, je ne veux pas:
- Effectuer toute sorte de recherche de base de données à partir de l'intérieur de mon point de vue (la séparation des préoccupations)
- Avoir à ajouter de la logique de chaque contrôleur de récupérer l'utilisateur courant (principe SEC)
- Ont pour ajouter une propriété de l'Utilisateur à chaque ViewModel.
Cela semble comme une "préoccupation horizontale" qui aurait une centralisation de la solution standard, mais je sens que je suis en manque un morceau du puzzle. Quel est le meilleur moyen d'obtenir des propriétés de l'utilisateur à partir de l'intérieur de vues?
Remarque: Il semble que le MVC équipe a côté intensifié ce problème dans les modèles de projet en veillant à ce que le nom de la propriété est toujours fixé à l'adresse électronique de l'utilisateur, en évitant soigneusement la nécessité pour eux d'effectuer cette recherche pour obtenir l'adresse email de l'utilisateur! Cela me semble un peu de la triche pour moi et dans ma solution le nom de l'utilisateur peut ou ne peut pas être leur adresse e-mail, donc je ne peux pas compter sur ce truc (et je pense qu'il y aura d'autres propriétés, j'ai besoin d'accéder à plus tard).
Je pense que j'ai peut-être quelque chose: voir les Composants. Dans MVC6 ceux-ci permettent une vue partielle sur ont leur propre contrôleur, dans lequel le UserManager peut être injecté. Plus d'expérimentation nécessaire, je vais poster ce que j'ai trouver, sauf si quelqu'un arrive avec une meilleure réponse en premier.
Couple de façons de voir cela se produire. vous pouvez soit ajouter des revendications à la direction avec valeurs nécessaires ou vous pouvez tout simplement créer des méthodes d'extension sur votre utilisation de l'application pour obtenir ces valeurs dans votre point de vue.
Veuillez mettre à jour ou ajouter votre propre réponse lorsque vous venez avec une solution viable. Je vous remercie.
Je suis pas sur la mise au point jusqu'à ce que Microsoft version RC2 de ASP.Net de base.
OriginalL'auteur Tim Long | 2016-03-03
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devriez utiliser des Allégations de la propriété de l'Utilisateur à cet effet. Je l'ai trouvé bon post à ce sujet: http://benfoster.io/blog/customising-claims-transformation-in-aspnet-core-identity
De l'utilisateur de la classe
Mettons MyProperty dans les Revendications de l'Utilisateur Authentifié. Pour cela, nous impérieuses UserClaimsPrincipalFactory
De l'enregistrement de notre UserClaimsPrincipalFactory en Démarrage.cs
Maintenant, nous pouvons accéder à notre propery comme ce
Nous pouvons créer une extension
Il convient d'ajouter @à l'Aide de la Vue (je l'ajouter à la global _ViewImport.cshtml)
Et, enfin, nous pouvons utiliser cette propriété dans n'importe quelle Vue que l'appel de méthode
Dans ce cas, vous n'avez pas les requêtes supplémentaires à la base de données pour obtenir des informations de l'utilisateur.
OriginalL'auteur Alfer
Mise à jour originale de réponse: (Ce qui viole les op de la première exigence, voir ma réponse originale à cette question si vous avez le même exigence de), Vous pouvez le faire sans modifier les revendications et l'ajout de l'extension de fichier (dans mon solution originale) par le référencement FullName dans le Rasoir Vue:
Réponse Originale À Cette Question:
C'est à peu près juste un court exemple de cette question stackoverflow et à la suite de cette tutoriel.
En supposant que vous avez déjà la propriété mis en place dans le "ApplicationUser.cs" ainsi que l'Viewmodel et les Vues de l'enregistrement.
Exemple à l'aide de "FullName" supplémentaires de la propriété:
Modifier la "AccountController.cs" Méthode Register:
Et puis j'ai ajouté un nouveau fichier "Extensions/ClaimsPrincipalExtension.cs"
et puis, en vous vues où vous avez besoin d'accéder à la propriété d'ajouter:
et de l'appeler en cas de besoin par:
Le seul problème avec cela est que j'ai dû supprimer mon test en cours de l'utilisateur, puis ré-inscrire afin de voir la "FullName" même si la base de données a la propriété FullName.
OriginalL'auteur willjohnathan
OK, voici comment j'ai finalement fait. J'ai utilisé une nouvelle fonctionnalité dans MVC6 appelé de voir les Composants. Ils fonctionnent un peu comme des vues partielles, mais ils ont un "mini contrôleur". La Vue est un Composant léger contrôleur de ne pas participer à la liaison de modèle, mais il peut avoir quelque chose de passé en paramètres du constructeur, éventuellement à l'aide de l'injection de dépendance et puis il est possible de construire un Modèle de Vue et passer à une vue partielle. Ainsi, par exemple, vous pouvez injecter une
UserManager
exemple dans la Vue Component, l'utiliser pour récupérer leApplicationUser
objet pour l'utilisateur actuel et passer à la vue partielle.Voici à quoi il ressemble dans le code. Tout d'abord, le point de Vue de la Composante, qui vit dans
/ViewComponents
répertoire:Noter que le
userManager
paramètre du constructeur est injecté par le framework MVC; il est configuré par défaut dansStartup.cs
dans un nouveau projet, donc il n'y a aucune configuration à faire.La vue de composant est appelé, sans surprise, par l'appel de la
Invoke
méthode ou la version asynchrone. La méthode récupère unApplicationUser
si possible, sinon, il utilise un utilisateur anonyme avec une certaine sécurité defaultspreconfigured. Il utilise à cet utilisateur de son partiel vue s le modèle de vue. Le point de vue des vies dans/Views/Shared/Components/UserProfile/Default.cshtml
et commence comme ceci:Et enfin, j'appelle cela de l'intérieur de mon
_Navigation.cshtml
vue partielle de la sorte:Celle-ci répond à toutes mes exigences, parce que:
La suite!!! J'espère que quelqu'un va trouver cela utile...
OriginalL'auteur Tim Long
J'ai le même problème et les mêmes préoccupations, cependant, j'ai choisi une autre solution au lieu de créer une méthode d'extension pour ClaimsPrincipal et laissez-la méthode d'extension de récupérer la coutume propriété de l'utilisateur.
Voici ma méthode d'extension :
À côté de mon point de vue (qui est aussi le LoginPartial vue), j'ai injecter le UserManager et puis transférez le UserManager à la méthode d'extension :
Cette solution, je crois, répond également à vos 3 les exigences de la séparation des préoccupations, SEC et pas de changement à tout ViewModel. Cependant, alors que cette solution est simple et peut être utilisé dans la norme des vues non seulement ViewComponents, je ne suis toujours pas heureux. Maintenant, à mon avis, je peux écrire :
@User.ProfilePictureUrl(userManager), mais je pense qu'il ne serait pas trop demander, je devrais être capable d'écrire seulement :
@User.ProfilePictureUrl().
Si seulement je pouvais faire le UserManager (ou IServiceProvider) disponible dans ma méthode d'extension sans fonction de l'injecter, il permettrait de résoudre le problème, mais je ne connais aucun moyen de le faire.
OriginalL'auteur Rasmus Rummel
Comme je l'ai été interrogé à ce sujet, je poste ma solution éventuelle, quoique dans un autre (MVC5/EF6).
Tout d'abord, j'ai défini une interface:
Puis, j'en œuvre que dans une classe de béton:
Enfin, je fais la configuration suivante dans mon DI noyau (je suis en utilisant Ninject):
Alors à chaque fois que je veux accéder à l'utilisateur actuel, il me suffit de l'injecter dans mon contrôleur par l'ajout d'un paramètre dans le constructeur de type
ICurrentUser
.J'aime bien cette solution, comme l'a joliment encapsule la préoccupation et évite mon contrôleurs ayant une dépendance directe sur EF.
OriginalL'auteur Tim Long
Vous avez besoin de faire une recherche (par exemple à l'aide de Entity Framework) avec le nom de l'utilisateur actuel:
Nous avons l'habitude d'enregistrer cette information une fois dans un objet de session et la réutilisation de l'objet.
Sens - grâce. Je vais mettre ce truc dans ma poche, au cas où j'en ai besoin. Je préfère ne pas utiliser l'état de session. J'ai eu que seriné moi très tôt, quand j'étais à l'apprentissage MVC et c'est quelque chose que j'ai collé à la mesure... pour info, j'ai répondu à ma propre question avec la solution que j'ai finalement utilisé.
OriginalL'auteur Rob Bos