Подтвердить что ты не робот

Ссылка на объект ASP.NET Identity 2.0 RoleManager.Roles 'не установлена ​​в экземпляр объекта.'

Я использую ASP.NET Identity 2.0 с проектом ASP.NET MVC 5 и EF 6.

Я пытаюсь редактировать роли, связанные с пользователями.

В моем контроллере useradmin у меня есть:

    //
    // GET: /Users/Edit/1
    public async Task<ActionResult> Edit(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        var user = await UserManager.FindByIdAsync(id);
        if (user == null)
        {
            return HttpNotFound();
        }

        var userRoles = await UserManager.GetRolesAsync(user.Id);

        return View(new EditUserViewModel()
        {
            Id = user.Id,
            Email = user.Email,
            RolesList = RoleManager.Roles.ToList().Select(x => new SelectListItem()
            {
                Selected = userRoles.Contains(x.Name),
                Text = x.Name,
                Value = x.Name
            })
        });
    }

Я получаю сообщение об ошибке

'Ссылка на объект не установлена ​​в экземпляр объекта.'

в строке:

return View(new EditUserViewModel()

Когда я пытаюсь:

    //
    // GET: /Users/Edit/1
    public async Task<ActionResult> Edit(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        ViewBag.RoleId = new SelectList(RoleManager.Roles, "Id", "Name");

        var user = await UserManager.FindByIdAsync(id);
        if (user == null)
        {
            return HttpNotFound();
        }
        return View("EditUser", user);
    }

Я получаю сообщение об ошибке

'Ссылка на объект не установлена ​​в экземпляр объекта.'

в строке:

ViewBag.RoleId = new SelectList(RoleManager.Roles, "Id", "Name");

Мне не хватает настроек конфигурации?

В начале контроллера я определяю:

    public UserManagementController(ApplicationUserManager userManager, ApplicationRoleManager roleManager)
    {
        UserManager = userManager;
        RoleManager = roleManager;
    }

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

    private ApplicationRoleManager _roleManager;
    public ApplicationRoleManager RoleManager
    {
        get
        {
            return _roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>();
        }
        private set
        {
            _roleManager = value;
        }
    }
4b9b3361

Ответ 1

Проблема заключается, как мы выяснили, в том, что вы забыли создать экземпляр ApplicationRoleManager для каждого запроса. Добавьте app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); в App_Start/Startup.Auth.cs, и вы в порядке.:)