向C# MVC API提交复杂数组时模型列表接收为空的问题排查
看起来你的问题核心是JSON反序列化失败,导致后端用List<teachersExcelDataModel>接收时为空,但用object[]能正常接收。下面一步步拆解原因和解决办法:
1. 值类型字段的null不匹配问题
你的模型里schoolNumber是int类型(值类型),但前端发送的JSON里schoolNumber是null:
"schoolNumber":null
值类型int不能存储null,JSON反序列化器遇到这种情况会直接失败,导致整个对象无法被解析,最终整个List就变成空的了。而object[]可以接收是因为object可以容纳null值,不会触发反序列化错误。
解决办法:把模型里的int类型改成可空的int?:
public int? schoolNumber { get; set; }
同理,检查其他值类型字段(比如Thursday1、Friday1这些),如果前端可能发送非数字或者null的情况,也要考虑是否改成可空类型。
2. 检查JSON格式是否完整
你提供的JSON内容里,第二个对象是不完整的(最后没有闭合的}和数组的]):
{"id":"201669887","name":"חנה",......,"th":["",......,""]
实际前端发送时如果JSON格式不完整,也会导致反序列化失败。务必确保JSON.stringify(this.sendData)生成的是完整、合法的JSON字符串。
3. 确认请求头的Content-Type设置
前端发送POST请求时,必须把Content-Type设置为application/json,否则后端的[FromBody]无法正确解析JSON数据。检查你的this.headers是否包含:
this.headers = new HttpHeaders().set('Content-Type', 'application/json');
如果缺少这个头,ASP.NET MVC会无法识别请求体里的JSON,导致List<teachersExcelDataModel>接收为空。
4. 排查反序列化异常(可选)
如果上面的步骤都做了还是有问题,可以在后端加日志或者捕获反序列化的异常,具体看看哪里出错了。比如用System.Text.Json的话,可以这样调试:
using System.Text.Json; public void PostExportExcel([FromBody] string rawJson) { try { var json = JsonSerializer.Deserialize<List<teachersExcelDataModel>>(rawJson); // 后续处理逻辑 } catch (JsonException ex) { // 这里打印异常信息,就能看到具体的反序列化错误 Console.WriteLine(ex.Message); } }
这样就能精准定位到JSON和模型不匹配的地方。
内容的提问来源于stack exchange,提问作者אסתר

