Model view controller ASP.NET核心添加和删除角色

Model view controller ASP.NET核心添加和删除角色,model-view-controller,asp.net-core-mvc,asp.net-core-identity,Model View Controller,Asp.net Core Mvc,Asp.net Core Identity,正如标题所说,如果角色与用户拥有的角色不匹配,我将尝试从我获得的数组中添加角色。那些匹配的我想被删除。这是我的控制器逻辑。 string id是我获得的角色的名称。 另外,当我运行这段代码时,我会得到一个异常 “用户安全戳不能为空。” [HttpPost] [ValidateAntiForgeryToken] 公共异步任务编辑(字符串id、用户、字符串[]角色) { if(id!=user.id) { 返回NotFound(); } if(ModelState.IsValid) { 尝试 { v

正如标题所说,如果角色与用户拥有的角色不匹配,我将尝试从我获得的数组中添加角色。那些匹配的我想被删除。这是我的控制器逻辑。 string id是我获得的角色的名称。 另外,当我运行这段代码时,我会得到一个异常 “用户安全戳不能为空。

[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(字符串id、用户、字符串[]角色)
{
if(id!=user.id)
{
返回NotFound();
}
if(ModelState.IsValid)
{
尝试
{
var listOfRoles=等待privateUser.GetRolesAsync(用户);
foreach(listOfRoles中的var角色。除了(角色))
{
等待privateUser.RemoveFromRoleAsync(用户,角色);
}
foreach(roles.Except中的var角色(listOfRoles))
{
等待privateUser.AddToroleAync(用户,角色);
}
wait_context.SaveChangesAsync();
}
catch(DbUpdateConcurrencyException)
{
如果(!UserExists(user.Id))
{
返回NotFound();
}
其他的
{
投掷;
}
}
返回重定向到操作(名称(索引));
}
返回视图(用户);
}

您使用的是通过POST获得的用户,这不仅是一种不好的做法,而且在这里甚至不起作用,因为您没有发布完整的
用户
对象。也就是说,
SecurityStamp
的值丢失,这就是异常告诉您的

不要发布
用户
。而是使用用户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]
公共异步任务编辑(字符串id,字符串[]角色)
{
var user=await\u userManager.FindByIdAsync(id);
if(user==null)
{
返回NotFound();
}
//代码的其余部分
更新(用于同时修改用户)

[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务编辑(字符串id、用户模型、字符串[]角色)
{
var user=await\u userManager.FindByIdAsync(id);
if(user==null)
{
返回NotFound();
}
//映射“model”(即发布的“User”)中的值
user.FirstName=model.FirstName;
//等等。
//对角色管理功能使用“用户”而不是“模型”

这是一个用于编辑用户的脚手架。它一直存在,这就是为什么会这样。我将使用您的建议。如果这是一个用于编辑用户的视图,您可能仍然需要
用户
参数(尽管您实际上应该使用视图模型)。但是,您添加内容的角色的用户实例应该是数据库中的用户,而不是发布的用户。谢谢它帮助了我!
[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