8
votes

Définition d'un utilisateur avec utilisateur.Identifity.name dans le constructeur du contrôleur

Pour mes actions qui vont interagir avec le compte de l'utilisateur, je voudrais créer un objet "TheUser" en plus d'ajouter cet objet à "ViewData [" TheUser "]" dès que toute action sur mon contrôleur est Appelé.

Si l'utilisateur est connecté, il saisira les informations de l'utilisateur à partir de la base de données, sinon, "Theruser" sera simplement nulle.

J'ai essayé d'accéder à "utilisateur.Identifity.name "Dans le constructeur du contrôleur, mais il n'est pas créé avant d'être appelé.

Je cherchais des filtres d'autorisation personnalisés, mais ceux-ci ne me permettent pas de créer l'objet" TheUser "et de stocker Dans la viewdata.

Ceci est un bref extrait de ce que je voudrais accomplir: xxx


1 commentaires

Cette réponse m'a aidé à mvc3 Stackoverflow.com/a/1506311/511438


4 Réponses :


2
votes

L'utilisateur doit-il être instancié pour chaque action du contrôleur ou simplement spécifique?

Si vous créez un actionfilterattribute, vous avez accès au contexte du contrôleur. Je ne sais pas si cela est vrai pour l'autorisationFilters, mais vous pouvez essayer quelque chose comme ceci: xxx

puis, fixez-le aux actions du contrôleur nécessaires.


1 commentaires

TheUser il est utilisé pour chaque action. Ce qui me casse-t-on, c'est que, bien que [Autoriser] garantit que l'utilisateur soit authentifié, je n'ai pas accès à l'utilisateur à l'utilisateur, mais je peux accéder à ViewData.



18
votes

J'ai créé une classe de contrôleur de base personnalisée et j'ai ajouté une propriété "actuelle" à celle-ci.

Dans la méthode d'initialisation, j'ai placé la logique pour obtenir l'utilisateur, puis l'ajouter à la vue ViewData et la propriété "CuroMuser" de Le contrôleur. P>

J'avais que mes contrôleurs héritent de la classe de contrôleur de base personnalisée et que j'ai pu faire référence à la variable "CourmentUser" n'importe où dans le contrôleur: P>

public class CustomControllerClass : Controller
{
    public User CurrentUser { get; set; }

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);

        if (requestContext.HttpContext.User.Identity.IsAuthenticated)
        {
            string userName = requestContext.HttpContext.User.Identity.Name;
            CurrentUser = UserRepository.GetUser(userName);
        }

        ViewData["CurrentUser"] = CurrentUser;                
    }
}


3 commentaires

Lorsque j'ai hérité de mon contrôleur à partir d'un basocontroller, toutes les demandes de toutes les valeurs Web s'arrêtent après avoir exécuté la méthode d'exécution de baseController et ne pas accéder aux méthodes d'action. Je reçois une page vierge dans le navigateur. Y a-t-il quelque chose de plus que nous devons faire pour courir cela?


Puneet, s'il vous plaît jeter un oeil à mon édition. Ma réponse originale était pour ASP.NET MVC 1. Je l'ai mis à jour pour remplacer la méthode Initialiser car c'est l'endroit accepté pour faire ce genre de chose dans MVC 2 et 3


Merci beaucoup, j'apprécie vraiment cela. Chassé depuis longtemps, votre réponse était belle et concise.



5
votes

I Configurez mon contrôleur de base de la même manière que la méthode de la consommation, et j'ai pu lire ces informations utilisateur sur le mannner suivant. Remarque: Je stocke uniquement l'ID utilisateur, pas l'objet utilisateur, mais le point de mon code consiste à montrer comment obtenir les informations requises dans la méthode ControidorTor.

public abstract class BaseController : Controller
{
    int _UserId = 0;

    public int UserId
    {
        get { return _UserId; }
        set { _UserId = value; }
    }

    public BaseController()
    {
        var userFromAuthCookie = System.Threading.Thread.CurrentPrincipal;

        if (userFromAuthCookie != null  && userFromAuthCookie.Identity.IsAuthenticated) // && !String.IsNullOrEmpty(userFromAuthCookie.Identity.Name))
        {
            busUser userBO = AceFactory.GetUser();
            string userNameFromAuthCookie = userFromAuthCookie.Identity.Name;
            _UserId = userBO.GetUserIdByUsername(userNameFromAuthCookie);
        }
    }


2 commentaires

J'essayais également de renvoyer l'utilisateur à l'aide de l'utilisateur.Identity - system.threading.thread.currentprincipal corrigé pour moi - merci beaucoup


System.threading.Trread.CurrentPrincipal m'a aidé à accéder à l'ID de mon utilisateur dans le constructeur actuel. Merci.



3
votes
public abstract class YourController : Controller
{
    public YourController()
    {
        var user = System.Threading.Thread.CurrentPrincipal;

        TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(user.Identity.Name) : null;

        ViewData["TheUser"] = TheUser;  
    }
}

0 commentaires