无法使用等待我的UserManager实例

时间:2017-10-12 18:59:20

标签: asp.net-mvc

我正在尝试使用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的初学者!

1 个答案:

答案 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对象,但您正在尝试传递任务。这就是你获得例外的原因。