You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET 6 Core MVC中使用async仅返回单个项而非多个的问题

ASP.NET 6 MVC异步代码仅显示第一个列表项问题

我正在使用ASP.NET 6 Core MVC Web应用程序,目前正从Webforms迁移至MVC,部分领域知识有所生疏。我正在学习async和await的用法(已查阅若干教程,虽有一定理解,但仍需实践摸索)。我将原有非异步代码改写为异步代码后,发现仅能在浏览器中显示第一个元素,而未使用async/await的代码可显示全部列表项。

异步代码示例(仅显示第一个元素)

public async Task<IActionResult> Index()
{
    var results = await collection.FindAsync(_ => true);

    foreach (var item in results.ToList())
    {
        await Response.WriteAsJsonAsync(item);
    }

    return View();
}

非异步代码示例(可显示全部项)

public IActionResult Index()
{
    var results = collection.Find(_ => true);

    foreach (var item in results.ToList())
    {
        Response.WriteAsync(item);
    }

    return View();
}

请问是否可以如此使用async,或是我遗漏了某些配置或代码以实现预期功能?


解决方案

问题根源

你遇到的问题不是async/await的用法错误,而是输出格式的问题:

  • 异步代码中,Response.WriteAsJsonAsync会将每个item单独序列化为一个完整的JSON对象,多次调用后输出的是多个独立JSON的拼接(比如{"id":1}{"id":2}),这是无效的JSON格式,浏览器只能解析第一个完整的JSON结构,所以只显示第一个元素。
  • 非异步代码的Response.WriteAsync如果直接输出字符串类型的item,多个字符串拼接后是有效的文本内容,浏览器可以正常显示全部。

正确的异步实现方式

根据MVC的设计思路,推荐以下两种正确写法:

1. 传递数据到View渲染(页面场景)

如果是要在MVC视图中展示列表,应该先获取所有数据,传递给View后由视图渲染:

public async Task<IActionResult> Index()
{
    var results = await collection.FindAsync(_ => true);
    var itemList = results.ToList();
    return View(itemList);
}

然后在对应的Index.cshtml视图中遍历渲染:

@model List<YourItemType>
@foreach (var item in Model)
{
    <div>@item.PropertyName</div>
}

2. 返回完整的JSON结果(API场景)

如果是要返回JSON格式的列表,应该将整个列表一次性序列化为JSON数组:

public async Task<IActionResult> Index()
{
    var results = await collection.FindAsync(_ => true);
    var itemList = results.ToList();
    return Json(itemList);
}

这样会输出标准的JSON数组([{"id":1},{"id":2}]),浏览器可以正确解析全部元素。

额外说明

  • 不要在MVC控制器中直接用Response.WriteAsJsonAsync逐个输出对象,这不符合MVC的响应规范,也会导致格式错误。
  • async/await的用法本身是正确的,问题出在响应输出的方式上,调整输出逻辑即可解决。

内容的提问来源于stack exchange,提问作者Computer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:50:27