ASP.NET Core中[FromBody]绑定对象始终为NULL的问题咨询
ASP.NET Core中[FromBody]绑定对象为NULL的原因及解决方法
差异原因
你手动读取请求体并用JsonConvert.DeserializeObject(Newtonsoft.Json)能正常反序列化,但使用[FromBody]时对象为NULL,核心原因是ASP.NET Core默认使用System.Text.Json进行模型绑定,而你手动用的是Newtonsoft.Json,两者的序列化/反序列化规则不一致。具体可能的差异点包括:
- 大小写匹配:System.Text.Json默认区分大小写,Newtonsoft.Json默认不区分。如果前端传的JSON属性是小驼峰(如
assignmentId),模型是大驼峰(AssignmentId),前者不会自动映射,后者会。 - 枚举处理:自定义枚举
AssignmentTypes的序列化规则在两个库中不同,若前端传字符串枚举值,System.Text.Json需显式配置才能正确解析。 - 绑定验证:若模型中
[Required]标记的字段(如CrewMemberId、ProjectId)在请求中缺失或格式错误,System.Text.Json会直接返回NULL,而Newtonsoft.Json可能会忽略验证先创建对象。
解决方法
方法1:切换框架使用Newtonsoft.Json
让框架和你手动反序列化使用的库一致,消除规则差异:
- 安装NuGet包:
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
- 在
Program.cs中配置:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { // 忽略循环引用(避免导航属性导致的序列化问题) options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; // 支持枚举字符串反序列化 options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); });
方法2:调整System.Text.Json配置
如果不想切换库,修改默认配置适配前端请求:
builder.Services.AddControllers() .AddJsonOptions(options => { // 开启大小写不敏感匹配 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 支持枚举字符串反序列化 options.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter()); // 忽略循环引用 options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; });
方法3:排查请求与模型的匹配问题
- 确认前端JSON的所有属性名与模型一致(或通过上述配置开启大小写不敏感)。
- 检查
[Required]标记的字段(CrewMemberId、ProjectId)是否在请求中存在且格式正确,缺失必填字段会导致模型绑定失败。
额外排查技巧
- 查看开发环境下的ASP.NET Core日志,框架会输出模型绑定失败的具体原因(如哪个字段验证不通过)。
- 用Postman直接发送符合格式的请求,排除前端代码的潜在问题。
内容的提问来源于stack exchange,提问作者Remo Pini
相关产品推荐
相关产品推荐

