ASP.NET MVC Ajax传递List到控制器时子项为null问题解决
问题根因
- 你当前的
$.ajax请求未指定内容类型,也未对嵌套对象数据做正确序列化:jQuery默认以application/x-www-form-urlencoded格式发送请求,这种格式下序列化包含对象的数组时,生成的请求参数键名不符合ASP.NET MVC默认模型绑定器的解析规则。 - 模型绑定器可以通过请求参数识别到
piezasConNotas列表的元素总数,但是因为找不到带正确索引前缀的子属性键(例如piezasConNotas[0].diente这类格式),无法给子对象属性赋值,最终就会出现列表长度正确但所有子对象属性全为null的现象。 - 控制台打印的JS对象结构正常仅代表前端内存里的数据没问题,不代表实际发送到服务端的参数格式符合绑定要求。
修复方案
采用JSON格式提交数据是这类复杂参数传递最稳定、改造成本最低的方案,ASP.NET MVC内置的JsonValueProviderFactory可以直接反序列化JSON格式的嵌套对象,不需要手动调整数组索引格式,具体修改如下:
- 给Ajax请求添加
type: "POST"配置,JSON格式数据不支持GET方式提交 - 添加
contentType: "application/json; charset=utf-8"配置,明确告知服务端当前发送的是JSON格式数据 - 用
JSON.stringify()方法将待提交的JS对象序列化为JSON字符串后,再赋值给data参数
修改后的前端代码示例:
var data = { "expediente": '@Model.NUMEMP', "edad": '@edad', "sexo": '@Model.SEXO', "piezasConNotas": piezasYNotas, "diagnostico": $("#diagnosticos").val(), "interconsulta_esp": "", "interconsulta": $("#interconsulta").val(), }; console.log(data); $.ajax({ url: '@Url.Action("AgregarExpedienteDental", "ServiciosMedicos")', type: "POST", contentType: "application/json; charset=utf-8", data: JSON.stringify(data), success: function (result) { if (result === "1") { Swal.fire('Success', 'Se ha insertado', 'success'); const myTimeout = setTimeout(myGreeting, 1500); } }, error: function (response) { console.error("请求失败", response); } });
注意事项
- 后端现有C#模型类不需要做任何修改,你当前定义的类结构、字段命名和前端传参完全匹配,改完前端配置即可正常完成模型绑定
- 若后端Action之前加了
[HttpGet]特性限制,需要调整为[HttpPost],否则会出现404或者405错误 - 不推荐继续使用Form UrlEncoded格式传递这类复杂嵌套对象:如果坚持用该格式,需要手动按照
[索引].属性名的规则拼接数组参数,或者引入额外的序列化插件实现,维护成本极高。
内容的提问来源于stack exchange,提问作者Reyneer Leon
相关产品推荐
相关产品推荐

