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

Angular中使用Observable获取ASP.NET Core API数据无法正常渲染表格问题求助

解决Angular接收ASP.NET Core Web API返回的带$id/$values格式数据的问题

看起来你遇到的问题是ASP.NET Core Web API返回的集合被序列化成了带有$id和$values的包装对象,导致Angular没法直接用*ngFor遍历。我来给你几个可行的解决思路:

问题原因

这种带$id和$values的格式,是因为ASP.NET Core使用的Newtonsoft.Json(或System.Text.Json的类似配置)启用了PreserveReferencesHandling选项——这个配置原本是用来处理对象循环引用的,但会把集合类型包装成包含引用标识的对象,而非直接返回原生数组。

解决方法

方案1:后端修改序列化配置(推荐)

直接让API返回原生数组,从根源解决问题。根据你的.NET版本,修改配置如下:

.NET 6+(Program.cs)

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        // 关闭引用保留,让集合直接返回数组
        options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;
        // 如果需要保留对象间引用(避免循环引用)但不想包装集合,可改用:
        // options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
    });

.NET 5及更早(Startup.cs)

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None;
        });
}

修改后,API会直接返回Oferta[]格式的JSON,Angular这边不需要额外处理,直接用*ngFor="let oferta of ofertas"就能正常渲染。

方案2:前端转换数据

如果暂时没法修改后端,可以在Angular的服务层把返回的包装对象转换成数组:

修改你的getOfertas方法,添加map操作符处理数据:

getOfertas(): Observable<Oferta[]> {
  return this.http.get<any>(`${this.urlWebAPI}/ofertas`)
    .pipe(
      tap(data=>console.log('OfertasService-get(): ', data) ),
      // 判断是否存在$values属性,存在则取数组,否则直接返回原数据
      map(response => response.$values ? response.$values : response),
      catchError(this.handleError)
    )
}

这样组件订阅后拿到的ofertas就是标准数组,模板里的*ngFor可以正常工作,无需修改模板代码。

额外小提示

看你的模板代码里,有几个列重复用了{{oferta.id}}(比如Organismo和Presupuesto列),应该是复制粘贴时的失误,记得改成对应的属性名(比如oferta.organismo、oferta.presupuesto),不然这些列会显示错误的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:42:31