使用AddToRoleAsync

时间:2017-02-16 15:40:06

标签: c# asp.net-mvc entity-framework

在我的人员控制器中,我有以下几行:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(PersonViewModel pvm)
    {
        if (ModelState.IsValid)
        {
            var person = db.people.Where(x => x.PersonId == pvm.PersonId).FirstOrDefault();
            var usr = new AccountController();
            usr.UserManager.AddToRoleAsync(person.NetId, pvm.SetRole);
            person.CurrentRole = pvm.SetRole;
            db.SaveChanges();
        }
        return View(pvm);
    }

使用UserManager.AddToRoleAsync()方法时,我在AccountController中得到一个空引用异常:

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

为什么HttpContext为null?是因为我正在实例化一个新的AccountController吗?如果是这样,我应该如何在UserManager获取,以便我可以将用户添加到角色?如何将用户从另一个控制器添加到角色?这似乎是一个常见的问题,因为用户管理是人们想要的东西。

1 个答案:

答案 0 :(得分:0)

所以我不得不付钱给顾问来回答这个问题。这是答案。

因为AccountController和PeopleController都继承自设置了HttpContext的Controller,所以我无法实例化一个新的AccountController,因为我失去了我已经拥有的PeopleController的上下文。所以答案是当从AccountController外部调用UserManager时,我需要做的就是使用以下内容:

var usr = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();

所以在我的代码的上下文中有一个例子:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Edit(PersonViewModel pvm)
        {
            if (ModelState.IsValid)
            {
                List<IdentityRole> roles = adb.Roles.ToList();
                var person = db.people.Where(x => x.PersonId == pvm.PersonId).FirstOrDefault();
                var usr = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
                foreach (var x in roles)
                {
                    await usr.RemoveFromRoleAsync(person.NetId, x.Name);
                }
                await usr.AddToRoleAsync(person.NetId, pvm.SetRole);
                person.CurrentRole = pvm.SetRole;
                db.SaveChanges();
                adb.SaveChanges();
            }
            return RedirectToAction("Index");
        }