web-dev-qa-db-fra.com

Accéder à UserManager en dehors de AccountController

J'essaie de définir la valeur d'une colonne dans la table aspnetuser à partir d'un autre contrôleur (pas accountcontroller). J'ai essayé d'accéder à UserManager mais je n'arrive pas à comprendre comment le faire.

Jusqu'à présent, j'ai essayé ce qui suit dans le contrôleur dans lequel je veux l'utiliser:

    ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
    u.IsRegComplete = true;
    UserManager.Update(u);

Cela ne compilerait pas (je pense parce que UserManager n'a pas été instancié par le contrôleur) 

J'ai également essayé de créer une méthode publique dans AccountController pour accepter la valeur en laquelle je veux changer la valeur et le faire ici, mais je ne sais pas comment l'appeler. 

public void setIsRegComplete(Boolean setValue)
{
    ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
    u.IsRegComplete = setValue;
    UserManager.Update(u);

    return;
}

Comment pouvez-vous accéder et modifier les données utilisateur en dehors du contrôleur de compte? 

METTRE À JOUR:

J'ai essayé d'instancier UserManager dans l'autre contrôleur de la manière suivante:

    var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
    ApplicationUser u = userManager.FindById(User.Identity.GetUserId());

Je me suis conformé au projet (je suis un peu excité), mais lorsque j'ai exécuté le code, l'erreur suivante s'est produite:

Additional information: The entity type ApplicationUser is not part of the model for the current context.

MISE À JOUR 2:

J'ai déplacé la fonction vers IdentityModel (ne me demandez pas que je serre dans mes mains ici) comme ceci:

   public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
        public Boolean IsRegComplete { get; set; }

        public void SetIsRegComplete(string userId, Boolean valueToSet)
        {

            var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>());
            ApplicationUser u = new ApplicationUser();
            u = userManager.FindById(userId);

            u.IsRegComplete = valueToSet;
            return;
        }
    }

Cependant, je reçois toujours ce qui suit:

The entity type ApplicationUser is not part of the model for the current context.

Il existe également la classe suivante dans IdentitiesModels.cs:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

Qu'est-ce que je fais mal ici? J'ai l'impression d'aboyer complètement le mauvais arbre. Tout ce que j'essaie de faire est de mettre à jour une colonne dans la table aspnetuser à partir de l'action d'un autre contrôleur (c'est-à-dire pas le contrôleur de comptes).

27
Spionred

Si vous utilisez le modèle de projet par défaut, la UserManager est créée de la manière suivante:

Dans le fichier Startup.Auth.cs, il y a une ligne comme celle-ci:

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

cela permet au pipeline OWIN d'instancier une instance de ApplicationUserManager chaque fois qu'une demande arrive sur le serveur. Vous pouvez obtenir cette instance à partir du pipeline OWIN en utilisant le code suivant dans un contrôleur:

Request.GetOwinContext().GetUserManager<ApplicationUserManager>()

Si vous examinez attentivement votre classe AccountController, vous verrez les éléments de code suivants qui permettent d’accéder à la variable ApplicationUserManager:

    private ApplicationUserManager _userManager;

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

Veuillez noter que si vous devez instancier la classe ApplicationUserManager, vous devez utiliser la méthode statique ApplicationUserManager.Create pour que les paramètres et la configuration appropriés lui soient appliqués.

30
Iravanchi

Si vous devez obtenir l'instance de UserManager dans un autre Contrôleur ajoutez simplement son paramètre dans le constructeur du contrôleur

public class MyController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;

    public MyController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;;
    }
}

Mais je dois obtenir UserManager dans une classe qui n'est pas un contrôleur!

Toute aide serait appréciée.

METTRE &AGRAVE; JOUR

Je considère que vous utilisez asp.net core

3

POUR MVC 5

Les étapes pour accéder à usermanger ou à createUser en dehors du contrôleur de compte sont simples. Suivez les étapes ci-dessous 

  1. Créez un contrôleur, considérez SuperAdminController
  2. Décorez le SuperAdminController de la même manière que le AccountController ci-dessous,

    private readonly IAdminOrganizationService _organizationService;
    private readonly ICommonService _commonService;
    private ApplicationSignInManager _signInManager;
    private ApplicationUserManager _userManager;
    
    public SuperAdminController()
    {
    }
    
    public SuperAdminController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)
    {
        UserManager = userManager;
        SignInManager = signInManager;
    }
    
    public SuperAdminController(IAdminOrganizationService organizationService, ICommonService commonService)
    {
        if (organizationService == null)
            throw new ArgumentNullException("organizationService");
    
    
        if (commonService == null)
            throw new ArgumentNullException("commonService");
    
        _organizationService = organizationService;
        _commonService = commonService;
    }
    
    
    public ApplicationSignInManager SignInManager
    {
        get
        {
            return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
        }
        private set
        {
            _signInManager = value;
        }
    }
    
    
    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }
    
  3. Méthode Créer un utilisateur en action

    [HttpPost]
    public async Task<ActionResult> AddNewOrganizationAdminUser(UserViewModel userViewModel)
    {
        if (!ModelState.IsValid)
        {
            return View(userViewModel);
        }
    
        var user = new ApplicationUser { UserName = userViewModel.Email, Email = userViewModel.Email };
        var result = await UserManager.CreateAsync(user, userViewModel.Password);
        if (result.Succeeded)
        {
            var model = Mapper.Map<UserViewModel, tblUser>(userViewModel);
    
            var success = _organizationService.AddNewOrganizationAdminUser(model);
    
            return RedirectToAction("OrganizationAdminUsers", "SuperAdmin");
    
        }
        AddErrors(result);
        return View(userViewModel);
    }
    
1
Ganesh Todkar

J'ai rencontré ce même problème et modifié mon code pour passer une référence à la classe UserManager du contrôleur au modèle:

//snippet from Controller
public async Task<JsonResult> UpdateUser(ApplicationUser applicationUser)
{
    return Json(await UserIdentityDataAccess.UpdateUser(UserManager, applicationUser));
}

//snippet from Data Model
public static async Task<IdentityResult> UpdateUser(ApplicationUserManager userManager, ApplicationUser applicationUser)
{
    applicationUser.UserName = applicationUser.Email;
    var result = await userManager.UpdateAsync(applicationUser);

    return result;
}
0
Mitch Stewart