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
相关产品推荐
相关产品推荐

