21

Próbuję ustawić wartość kolumny w tabeli aspnetuser z innego kontrolera (nie accountcontroller). Próbowałem uzyskać dostęp do UserManager, ale nie mogę wymyślić, jak to zrobić.Dostęp do UserManager poza AccountController

Dotychczas Próbowałem następujących w kontrolerze chcę go używać w:

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

Nie byłoby skompilować (myślę ponieważ UserManager nie została instancja kontrolera)

również próbowałem utworzyć publiczną metodę w AccountController, aby zaakceptować wartość, na którą chcę zmienić wartość i zrobić to, ale nie mogę wymyślić, jak ją nazwać.

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

    return; 
} 

W jaki sposób uzyskujesz dostęp i edytujesz dane użytkownika poza kontem kontrolera?

UPDATE:

Próbowałem instancję UserManager w drugim kontrolerze tak:

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

I projekt przestrzegane (got trochę podniecony), ale kiedy wpadłem kod pojawia się następujący błąd:

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

UPDATE 2:

mam ruch d funkcja do IdentityModel (nie pytajcie mnie chwytając się brzytwy tutaj) tak:

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; 
     } 
    } 

Jednak ja wciąż otrzymuję następujący:

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

Istnieje także następujące klasy w IdentitiesModels.cs:

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

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

Co ja tu robię źle? Wydaje mi się, że zupełnie szczerzę złe drzewo. Wszystko, co próbuję zrobić, to zaktualizować kolumnę w tabeli aspnetuser z działania innego kontrolera (tj. Nie jest to AccountsController).

+0

Wygląda na to, że komunikat o błędzie, taki jak "db", który przechodzisz do sklepu, nie jest tym samym DbContext, który zawiera tabele tożsamości. – Iravanchi

+0

Czy masz "public klasy ApplicationDbContext: IdentityDbContext {}' w klasie kontekstowej 'db'? –

+0

Zobacz zaktualizowany wpis powyżej - dzięki – Spionred

Odpowiedz

27

Jeśli używasz domyślnego szablonu projektu, UserManager zostanie utworzony następujący sposób:

w pliku Startup.Auth.cs, istnieje linia tak:

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

sprawia, że OWIN potokuje instancję ApplicationUserManager za każdym razem, gdy żądanie dotrze do serwera.Możesz dostać to wystąpienie z OWIN rurociągu za pomocą następującego kodu wewnątrz kontrolera:

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

Jeśli przyjrzeć się uważnie swojej klasie AccountController, zobaczysz następujące fragmenty kodu, które uzależnia dostęp do ewentualna ApplicationUserManager:

private ApplicationUserManager _userManager; 

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

Należy pamiętać, że w przypadku trzeba instancję klasy ApplicationUserManager, trzeba użyć metody statycznej ApplicationUserManager.Create tak, że masz odpowiednie ustawienia i konfigurację stosowane do niego.

+0

Dzięki za wkład. Sugestia w powyższym komentarzem zadziałała. Zachowałem kod w pliku IdentityModels.cs, ponieważ będę musiał uzyskać do niego dostęp w wielu miejscach. – Spionred

+2

Sugeruję, abyś odzyskał 'UserManager' z kontekstu OWIN zamiast tworzyć nową instancję, ponieważ jest tworzony w każdym zapytaniu, a tworzenie nowego jest zbędnym narzutem. – Iravanchi

3

Jeśli trzeba uzyskać instancję UserManager w innym Controller po prostu dodaj swój parametr w konstruktorze kontrolera jak ten

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

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

Ale muszę dostać UserManager w klasie, który nie jest kontrolerem!

Każda pomoc zostanie doceniona.

UPDATE

Zastanawiam używasz rdzeń asp.net

+0

Ale jak przekazać go do kontrolera w pierwszej kolejności? Nie mam żadnych odniesień do kontrolera w całym moim projekcie, więc nie wiem, jak przekazać to odniesienie do userManager? Gdzie jest faktycznie utworzony? – rolls

+0

Nie, nie. UserManager zostanie wprowadzony do kontrolerów aplikacji z twojej klasy startup.cs. Utwórz projekt tożsamości ASP.NET w środowisku ASP.NET Core i zobacz klasę startup.cs. Następujący kod wstrzykiwania UserManager instancję kontrolerów services.AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders(); –

+0

Widzę, mnóstwo magii się dzieje. Trudne do naśladowania, gdy cały kod, który robi to, jest ukryty. – rolls

0

wpadłem na ten sam problem i modyfikowane mój kod przekazać referencję do klasy UserManager od kontrolera do modelu:

Powiązane problemy