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

React+Axios调用.NET Core接口时GUID传值为全零问题求助

问题分析

前端使用guid-typescript库的Guid对象作为请求参数,序列化后生成的JSON结构为{"userId":{"value":"24883e12-439d-4e54-aae5-5b1d5140833e"}},而.NET Core默认的JSON序列化器(System.Text.Json)期望userId字段直接是字符串格式的GUID,因此无法正确解析嵌套结构,导致后端接收到的userId为空的默认GUID(00000000-0000-0000-0000-000000000000)。

解决方法

方案一:前端修改(推荐)

直接传递GUID字符串而非Guid对象,让请求JSON结构符合后端预期:

修改方式1:调整TypeScript接口与传参逻辑

import { Guid } from "guid-typescript";

// 接口改为接收字符串类型的userId
interface IListContactRequest {
  userId: string;
}

const ListContacts = (userId: string) => {
  return axios
    .post(API_URL + "/listContacts", { userId }, {
      headers: {
        "Content-Type": "application/json",
      },
    })
    .then((response) => response.data);
};

// 调用示例(如果原有逻辑是拿到Guid对象):
// const userGuid = Guid.create();
// ListContacts(userGuid.value);

修改方式2:保持原有接口,传参时转换为字符串

如果不想修改接口定义,在发送请求前提取Guid对象的value属性:

import { Guid } from "guid-typescript";

interface IListContactRequest {
  userId: Guid;
}

const ListContacts = (user: IListContactRequest) => {
  // 将Guid对象转换为字符串,构造符合要求的请求体
  const payload = { userId: user.userId.value };
  return axios
    .post(API_URL + "/listContacts", payload, {
      headers: {
        "Content-Type": "application/json",
      },
    })
    .then((response) => response.data);
};

方案二:后端修改(适配前端序列化结构)

如果无法修改前端代码,可以通过自定义JSON转换器让.NET Core支持解析嵌套的value结构:

步骤1:创建自定义Guid转换器

using System.Text.Json;
using System.Text.Json.Serialization;

public class GuidValueConverter : JsonConverter<Guid>
{
    public override Guid Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 处理嵌套的value对象
        if (reader.TokenType == JsonTokenType.StartObject)
        {
            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.PropertyName && reader.GetString() == "value")
                {
                    reader.Read();
                    return Guid.Parse(reader.GetString()!);
                }
            }
        }
        // 兼容直接传递字符串的情况
        return Guid.Parse(reader.GetString()!);
    }

    public override void Write(Utf8JsonWriter writer, Guid value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}

步骤2:注册转换器(全局或局部)

全局注册(.NET 6+)

在Program.cs中配置全局JSON序列化选项:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new GuidValueConverter());
    });

var app = builder.Build();

// ...其他中间件配置
app.Run();

局部注册(仅针对特定字段)

直接在ListContactRequest的userId字段上添加特性:

using System.Text.Json.Serialization;

public class ListContactRequest
{
    [JsonConverter(typeof(GuidValueConverter))]
    public Guid userId { get; set; }
}

方案三:后端临时适配(不推荐)

如果只是临时解决,可以修改请求模型适配前端的嵌套结构,后续再优化:

public class GuidWrapper
{
    public string value { get; set; } = string.Empty;
}

public class ListContactRequest
{
    public GuidWrapper userId { get; set; } = new GuidWrapper();
}

// 在接口中转换为Guid:
[Authorize]
[HttpPost]
[Route("listContacts")]
public async Task<AddressBookListContacts> listContacts([FromBody]ListContactRequest req)
{
    Guid userId = Guid.Parse(req.userId.value);
    // ...后续逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:20:31