我正在尝试使用UserManager的实例提取所选用户,以便在视图中显示有关特定用户的详细信息。我正在尝试使用以下代码行:
var user = await _userManager.Users.SingleOrDefaultAsync(m => m.Id == id);
但是,这会出现以下错误:
“'await'运算符只能在异步方法中使用。”
我真的很困惑,因为SingleOrDefaultAsync方法肯定是一个异步方法 - 线索就在名字中!当我将鼠标悬停在它上面时,它甚至会说'等待',那么为什么我不能在这种情况下使用'await'关键字呢?
我尝试过取出'await'关键字然后编译,但如果我尝试访问View,我会收到以下错误:
InvalidOperationException:传递给ViewDataDictionary的模型项的类型为'System.Threading.Tasks.Task`1 [MyProject.Models.ApplicationUser]',但此ViewDataDictionary实例需要类型为'MyProject.Models.ApplicationUser的模型项”。
对于上下文,这是我的控制器方法:
//
// GET /Account/Details/5
public IActionResult Details(string id)
{
if (id == null)
{
return NotFound();
}
var user = _userManager.Users.SingleOrDefaultAsync(m => m.Id == id);
if (user == null)
{
return NotFound();
}
return View(user);
}
这是我的观点所期待的:
@model ApplicationUser
非常感谢任何帮助,如果这是一件非常容易让我苦苦挣扎的事情,我很抱歉,我仍然是.Net和MVC的初学者!
答案 0 :(得分:1)
制作行动方法async
。它现在应该返回Task<IActionResult>
而不是IActionResult
现在你可以等待
中的异步方法了public async Task<IActionResult> Details(string id)
{
if (id == null)
{
return NotFound();
}
var user = await _userManager.Users.SingleOrDefaultAsync(m => m.Id == id);
if (user == null)
{
return NotFound();
}
return View(user);
}
InvalidOperationException:传递给的模型项 ViewDataDictionary属于类型 &#39; System.Threading.Tasks.Task`1 [MyProject.Models.ApplicationUser]&#39;,但 此ViewDataDictionary实例需要类型的模型项 &#39; MyProject.Models.ApplicationUser&#39;
在没有await
关键字的情况下调用异步方法时,会出现上述异常。当您执行以下代码时,
var user = _userManager.Users.SingleOrDefaultAsync(m => m.Id == id);
此处用户的类型为Task<User>
,而非User
。但是您的视图强烈输入User
并期望User
对象,但您正在尝试传递任务。这就是你获得例外的原因。