21

Я пытаюсь установить значение столбца в таблице aspnetuser с другого контроллера (не accountcontroller). Я пытался получить доступ к UserManager, но я не могу понять, как это сделать.Доступ к UserManager за пределами AccountController

До сих пор я попытался следующие в контроллере Я хочу использовать его в:

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

Это не компилировать (я думаю, потому что UserManager не был создан экземпляр контроллера)

I также попытался создать публичный метод в AccountController, чтобы принять значение, которое я хочу изменить, и сделать его там, но я не могу понять, как его вызвать.

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

    return; 
} 

Как вы получаете доступ и редактируете данные пользователя за пределами Контроллера учетных записей?

UPDATE:

Я попытался создать экземпляр UserManager в другом контроллере так:

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

I проект выполнил (погорячился), но когда я побежал код я получаю следующее ошибка:

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

UPDATE 2:

у меня есть движение d функция к IdentityModel (не спрашивайте, я схватился за соломинку здесь) вот так:

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

Однако я все еще получаю следующее:

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

Существует также следующий класс IdentitiesModels.cs:

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

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

Что я здесь делаю неправильно? Похоже, я полностью лаем неправильное дерево. Все, что я пытаюсь сделать, это обновить столбец таблицы aspnetuser от действия другого контроллера (т. Е. Не AccountsController).

+0

Похоже, что сообщение об ошибке, подобное «db», которое вы передаете в хранилище, - это не тот же DbContext, который содержит ваши таблицы Identity. – Iravanchi

+0

Есть ли у вас 'public class ApplicationDbContext: IdentityDbContext {}' в вашем классе 'db' context? –

+0

См. Обновленное сообщение выше - спасибо – Spionred

ответ

27

Если вы используете шаблон проекта по умолчанию, то UserManager будет создаваться следующим образом:

В файле Startup.Auth.cs, есть линия, как это:

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

, что делает Конвейер OWIN создает экземпляр ApplicationUserManager каждый раз, когда запрос поступает на сервер.Вы можете получить этот экземпляр из трубопровода Owin, используя следующий код внутри контроллера:

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

Если вы внимательно посмотрите на свой AccountController классе, вы увидите следующие фрагменты кода, что делает доступ к возможным ApplicationUserManager:

private ApplicationUserManager _userManager; 

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

Пожалуйста, обратите внимание, что в случае, если вам необходимо создать экземпляр класса ApplicationUserManager, вам нужно использовать статический метод ApplicationUserManager.Create так, что у вас есть соответствующие настройки и конфигурации, примененные к нему.

+0

Спасибо за вклад. Предложение в комментарии выше работало. Я сохранил код в файле IdentityModels.cs, поскольку мне нужно будет получить к нему доступ в нескольких местах. – Spionred

+2

Я предлагаю вам получить «UserManager» из контекста OWIN вместо создания нового экземпляра, поскольку он создается в каждом запросе в любом случае, а создание нового - избыточные издержки. – Iravanchi

3

Если у вас есть, чтобы получить экземпляр UserManager в другом контроллера просто добавить свой параметр в конструкторе контроллера, как этого

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

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

Но я должен получить UserManager в классе, который не регулятор!

Любая помощь будет оценена по достоинству.

UPDATE

Я рассматриваю вы используете asp.net ядро ​​

+0

Но как вам передать его вашему контроллеру в первую очередь? У меня нет ссылок на мой контроллер во всем моем проекте, поэтому я не знаю, как передать ему ссылку на userManager? Где он фактически создан? – rolls

+0

Нет нет. UserManager будет введен вашим контроллерам приложений из класса startup.cs. Сделайте проект ASP.NET Identity в ядре ASP.NET и просмотрите класс startup.cs. Следующий код инъекционного UserManager Instance для контроллеров services.AddIdentity () .AddEntityFrameworkStores () .AddDefaultTokenProviders(); –

+0

Итак, я вижу, много волшебства продолжается. Трудно следовать, когда весь код, который делает это, скрыт. – rolls

0

Я столкнулся с этой же проблемой и изменил мой код, чтобы передать ссылку на класс UserManager от контроллера к модели:

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

 Смежные вопросы

  • Нет связанных вопросов^_^