正如标题所述,如果角色与用户所拥有的角色不匹配,我将尝试从获得的数组中添加角色。那些与我匹配的人要删除。这是我的控制器逻辑。 字符串ID是我得到的角色的名称。 另外,当我运行此代码时,我得到一个异常提示 “ 用户安全性戳不能为空。”
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User user, string[] roles)
{
if (id != user.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
var listOfRoles = await privateUser.GetRolesAsync(user);
foreach (var role in listOfRoles.Except(roles))
{
await privateUser.RemoveFromRoleAsync(user, role);
}
foreach(var role in roles.Except(listOfRoles))
{
await privateUser.AddToRoleAsync(user, role);
}
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(user.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(user);
}
答案 0 :(得分:1)
您正在使用通过POST获得的用户,这不仅是不习惯的做法,而且甚至在这里也不起作用,因为您没有发布完整的User
对象。即,SecurityStamp
的值丢失了,这就是异常告诉您的内容。
请勿发布User
。而是使用用户ID从数据库中获取它:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, string[] roles)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null)
{
return NotFound();
}
// the rest of your code
更新(用于同时修改用户)
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(string id, User model, string[] roles)
{
var user = await _userManager.FindByIdAsync(id);
if (user == null)
{
return NotFound();
}
// map over the values from `model` (i.e. the posted `User`)
user.FirstName = model.FirstName;
// etc.
// use `user` not `model` for role management functions