"任务<PeopleUser>不包含角色的定义,也没有扩展方法"角色"接受 Tasl <PeopleUser>类型的第一个参数



有人可以帮我吗?我想在标识 3 中实现编辑用户的角色,但是当我写这篇文章时,我有一个错误:

任务不包含角色的定义,也没有 扩展方法"角色"接受类型的第一个参数 任务

这是控制器代码

public virtual ActionResult Edit(PeopleUser user, string role)
{
    if (ModelState.IsValid)
    { 
        var oldUser = _userManager.FindByIdAsync(user.Id);
        var oldRoleId = oldUser.Roles.SingleOrDefault().RoleId;
        var oldRoleName = _db.Roles.SingleOrDefault(r => r.Id == oldRoleId).Name;
        if (oldRoleName != role)
        {
            _userManager.RemoveFromRoleAsync(user, oldRoleName);
            _userManager.AddToRoleAsync(user, role);
        }
        _db.Entry(user).State = EntityState.Modified;
        return RedirectToAction("Index", "Home");
    }
    return View(user);
}
您需要

await Task,然后才能使用 TUser 对象。

// Note that the signature has async and Task<ActionResult>.
public virtual async Task<ActionResult> Edit(PeopleUser user, string role)
{
    if (ModelState.IsValid)
    { 
        var oldUser = await _userManager.FindByIdAsync(user.Id); // Note the await keyword.
        var oldRoleId = oldUser.Roles.SingleOrDefault().RoleId;
        var oldRoleName = _db.Roles.SingleOrDefault(r => r.Id == oldRoleId).Name;
        if (oldRoleName != role)
        {
            // I've added await here as well...
            await _userManager.RemoveFromRoleAsync(user, oldRoleName);
            await _userManager.AddToRoleAsync(user, role);
        }
        _db.Entry(user).State = EntityState.Modified;
        return RedirectToAction("Index", "Home");
    }
    return View(user);
}

FindByIdAsync() 返回 Task<TUser> ,这意味着您需要在访问 TUser 对象之前"解包"它。通过使用 await 关键字解包它。

public virtual Task<TUser> FindByIdAsync(
    TKey userId
)

所以澄清你的例子:

// Create the task. Note the difference between the types of oldUserTask and oldUser.
Task<User> oldUserTask = _userManager.FindByIdAsync(user.Id);
// Await the task.
User oldUser = await oldUserTask;
// Now you can do something with oldUser.
oldUser.DoStuff();

有关异步编程的更多信息,请单击此处。

在 .NET Framework 编程中,异步方法通常返回 TaskTask<TResult>.在异步方法中,await运算符为 应用于从调用另一个异步方法返回的任务。 Task<TResult>如果该方法包含 return 语句,指定类型为 TResult 的操作数。你使用 如果该方法没有 return 语句或具有Task 不返回操作数的返回语句。

最新更新