有人可以帮我吗?我想在标识 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 编程中,异步方法通常返回
Task
或Task<TResult>
.在异步方法中,await
运算符为 应用于从调用另一个异步方法返回的任务。Task<TResult>
如果该方法包含 return 语句,指定类型为TResult
的操作数。你使用 如果该方法没有 return 语句或具有Task
不返回操作数的返回语句。