【问题标题】:How to return an action result of async Task<IEnumerable<SomeClass>>?如何返回异步任务<IEnumerable<SomeClass>>的动作结果?
【发布时间】:2019-07-25 05:25:41
【问题描述】:

我有此代码,但控制器期望返回类型为 ActionResult。 为什么控制器正在接受这样的Task> return await _context.Users.ToListAsync();(生成控制器时的默认代码)?

//controller
public async Task<ActionResult<IEnumerable<User>>> GetUsers()
{
        return await _userService.GetAll();
}
//service method
public async Task<IEnumerable<User>> GetAll()
{
    return await _db.Users.ToListAsync();
}

【问题讨论】:

  • @mjwills 编译器说'无法将类型 IEnumerable 隐式转换为 ActionResult > 我在想如何返回 anActionResult >。
  • @ract 只需从控制器返回`IEnumerable`。
  • @John 是的。如果我将控制器更改为 Task>,它将起作用。但我还需要返回一个 NotFoundResult,这就是为什么它必须是 ActionResult 的返回类型。

标签: c# asp.net-core .net-core


【解决方案1】:

我相信你需要这样的东西:

public async Task<ActionResult<IEnumerable<User>>> MyController()
{
    var res = await _userService.GetAll();

    if (res == null)
    {
        return NotFound();
    }

    return Ok(res);
}

作为旁注,我建议将IEnumerable&lt;&gt; 更改为IList&lt;&gt;。此处返回可枚举并不完全正确,您还可能遇到“多重枚举”问题。

【讨论】:

  • 为什么它不在ActionResult documentation中?
  • 是的。我在寻找错误的文档。谢谢!
  • 正要这么说。正确的是here。另外,我建议返回 IList&lt;&gt; 或其他内容以避免出现多个枚举问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2013-03-22
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多