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

React中部分API数据无法传递到客户端的问题排查

问题排查:.NET API字段在React中部分未加载的原因

1. JsonData类的Data属性类型导致序列化丢失字段

你的JsonData类中Data属性定义为object?类型,当你将PackageStatusResult实例赋值给它时,ASP.NET Core的JSON序列化器无法识别对象的实际类型,可能导致部分属性无法被正确序列化。而单元测试直接操作C#对象,不会触发JSON序列化,所以能拿到完整数据。

解决方法:将JsonData改为泛型类(推荐),或者明确指定Data的类型为PackageStatusResult:

// 泛型版本
public class JsonData<T>
{
    public bool IsSuccess { get; set; }
    public T? Data { get; set; }
    public string? Message { get; set; }
}

// API返回时使用泛型
return Ok(new JsonData<PackageStatusResult>()
{
    IsSuccess = true, 
    Message = "ok", 
    Data = data
});

或者直接修改JsonData的Data类型:

public class JsonData
{
    public bool IsSuccess { get; set; }
    public PackageStatusResult? Data { get; set; }
    public string? Message { get; set; }
}

2. JSON字段大小写不匹配

.NET类属性默认使用PascalCase(大驼峰)(如Drives、LastPackageData),而你React状态中定义的是camelCase(小驼峰)(如drives、lastPackageData)。若ASP.NET Core未配置驼峰命名序列化,API返回的JSON字段会是大驼峰,此时用小驼峰访问(如info.data.drives)会取不到值。

你可以通过浏览器开发者工具的Network标签,查看/home/PackageStatus请求的响应内容,确认字段名大小写是否匹配。

解决方法:在ASP.NET Core中配置JSON序列化使用驼峰命名,在Program.cs中添加:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
    });

3. 实体类存在循环引用或序列化限制

如果Drive、Pump等实体类与其他EF Core实体存在循环引用(如Drive关联Package,Package又关联Drive),JSON序列化时会自动跳过这些属性避免无限递归。另外,若实体类属性没有公共getter,或被标记[JsonIgnore]特性,也会导致字段不被序列化。

解决方法:

  • 配置JSON序列化忽略循环引用:
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
    });
  • 检查实体类属性,确保需要返回的属性都有公共getter,且未被标记[JsonIgnore]。

4. React状态字段名与API返回不匹配

你的React组件初始化info的data字段用了小驼峰,若API返回大驼峰字段,执行setInfo(response)后,info.data中会同时存在初始化的空字段(如drives)和API返回的实际字段(如Drives),此时访问info.data.drives自然拿不到数据。

解决方法:确保React访问的字段名与API返回完全一致,或拿到响应后手动映射字段:

.then((response) => {
    const mappedData = {
        ...response,
        data: {
            drives: response.data.Drives,
            pumps: response.data.Pumps,
            lastPackageData: response.data.LastPackageData,
            package: response.data.Package,
            workPlans: response.data.WorkPlans,
            lastCommand: response.data.LastCommand,
            message: response.data.Message
        }
    };
    setInfo(mappedData);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:40:59