ASP.NET插入含子模型列表的主模型时出现400错误
1. 检查请求Content-Type头
AJAX提交JSON时必须明确设置contentType: "application/json; charset=utf-8",否则ASP.NET会默认尝试用表单格式解析请求,无法匹配复杂的List结构,直接返回400错误。
修正后的AJAX示例代码:
$.ajax({ url: "/Patient/Create", type: "POST", contentType: "application/json; charset=utf-8", data: JSON.stringify(patientData), success: function(result) { // 处理成功逻辑 }, error: function(xhr) { console.log(xhr.responseText); } });
2. 确保动态输入字段的命名符合Model绑定规则
用PartialView动态添加联系人时,输入字段的name属性必须遵循ASP.NET List绑定格式:Contacts[0].Name、Contacts[1].Phone这类连续索引的命名。如果字段名称是Contacts.Name或索引断号(比如删除中间项后索引不连续),模型绑定会直接失败。
PartialView字段写法示例:
@model ContactModel <div class="contact-item"> <input type="text" name="Contacts[@ViewData["Index"]].Name" asp-for="Name" /> <input type="text" name="Contacts[@ViewData["Index"]].Phone" asp-for="Phone" /> </div>
动态添加时要保证索引连续递增,删除项后建议重新整理索引,避免断号。
3. 检查Model类的验证规则
如果PatientModel或ContactModel中有必填属性未赋值、数据格式不符合验证规则(比如邮箱格式错误、数值超出范围),ASP.NET的ModelState验证会在进入控制器前就返回400。可以在AJAX的error回调中打印响应文本,查看具体验证错误:
error: function(xhr) { console.log("验证错误详情:", JSON.parse(xhr.responseText)); }
4. 确认JSON序列化后的结构正确
提交前用console.log(JSON.stringify(patientData))打印序列化后的JSON,确保结构与PatientModel完全匹配。Contacts必须是数组格式,每个元素包含ContactModel的所有属性。
正确的JSON结构示例:
{ "PatientName": "张三", "Age": 30, "Contacts": [ { "Name": "李四", "Phone": "13800138000" }, { "Name": "王五", "Phone": "13900139000" } ] }
5. 检查控制器Action的参数定义
Create接口的参数必须添加[FromBody]特性,告诉ASP.NET从请求体的JSON中绑定模型。如果缺少该特性,默认会从表单数据绑定,导致无法解析JSON,直接返回400。
控制器代码示例:
[HttpPost] public IActionResult Create([FromBody] PatientModel model) { if (ModelState.IsValid) { // 业务处理逻辑 return Ok(); } return BadRequest(ModelState); }
内容的提问来源于stack exchange,提问作者Pedro William

