向.NET Core Entity Framework API提交含IEnumerable成员的JSON时成员为空
我来帮你排查这个IEnumerable成员始终为null的问题,大概率是模型绑定相关的细节没做好,咱们一步步来梳理可能的原因和解决办法:
1. 先确认模型类结构是否和JSON完全匹配
你的JSON外层是apiModel对象,里面包含Results数组,所以你的C#模型必须对应这个层级结构,而且要注意属性名的大小写映射(C#默认是PascalCase,JSON是camelCase,.NET Core/.NET 5+默认支持自动映射,但也可以手动指定)。
举个正确的模型示例:
// 对应JSON外层的请求模型 public class RequestModel { // 要和JSON里的"apiModel"对应,默认会自动映射camelCase,或者用[JsonPropertyName]指定 public ApiModel ApiModel { get; set; } } // 对应JSON里的apiModel对象 public class ApiModel { // 对应JSON里的"Results"数组 public IEnumerable<ResultItem> Results { get; set; } } // 对应Results数组里的每个元素 public class ResultItem { public string ActivityIdentifier { get; set; } public string CharacteristicName { get; set; } public bool SubmitData { get; set; } }
如果你的模型少了外层的RequestModel,或者属性名和JSON键名不匹配(比如把Results写成Result),都会导致绑定失败,成员为null。
2. 检查API控制器的参数绑定配置
确保你的控制器方法参数加上了[FromBody]特性,因为JSON是通过请求体提交的,ASP.NET Core需要明确知道从哪里绑定数据:
[HttpPost] public IActionResult SubmitData([FromBody] RequestModel request) { // 这里断点查看request.ApiModel.Results return Ok(); }
如果没加[FromBody],框架会尝试从URL参数绑定,自然拿不到请求体里的JSON数据,导致Results为null。
3. 验证请求的Content-Type头是否正确
发送请求时,必须把请求头的Content-Type设置为application/json,否则ASP.NET Core的JSON格式化器不会处理请求体内容,模型绑定就会失败。不管你用Postman、curl还是前端代码发送请求,这一步都不能忘。
4. 检查JSON格式是否合法
你提供的JSON看起来是有效的,但可以用JSON校验工具确认一下有没有隐藏的语法错误(比如多余的逗号、不匹配的引号),无效的JSON也会导致绑定失败。你的示例JSON如下(已格式化,方便查看):
{ "apiModel": { "Results":[ { "ActivityIdentifier":"abc", "CharacteristicName": "Dissolved Oxygen", "SubmitData": true }, { "ActivityIdentifier":"efg", "CharacteristicName": "pH", "SubmitData": true } ] } }
5. 排查自定义JSON序列化配置
如果你在Program.cs/Startup.cs里自定义了JsonOptions,比如禁用了camelCase自动映射,那会导致属性名不匹配:
builder.Services.AddControllers() .AddJsonOptions(options => { // 禁用了camelCase映射,此时JSON键名必须和模型PascalCase属性名完全一致 options.JsonSerializerOptions.PropertyNamingPolicy = null; });
这种情况下,你需要把JSON里的apiModel改成ApiModel,或者恢复默认的camelCase配置。
先从上面这几点排查,尤其是前三个,是最常见的问题根源。
内容的提问来源于stack exchange,提问作者Ella

