在我的人员控制器中,我有以下几行:
[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
获取,以便我可以将用户添加到角色?如何将用户从另一个控制器添加到角色?这似乎是一个常见的问题,因为用户管理是人们想要的东西。
答案 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");
}