如何通过FormData向MVC控制器传递嵌套对象?接收时对象始终为空
解决FormData发送嵌套对象到MVC控制器时对象为null的问题
我太懂你这种卡壳的感觉了——用FormData发数据,数组能正常接收,但嵌套的details对象始终是null,折腾半天找不到问题。其实核心原因是FormData本身不支持直接的嵌套对象自动绑定,MVC的模型绑定器需要特定的字段命名格式才能识别嵌套属性。
问题根源
你现在的代码是直接把personfood.details的属性以firstname、lastname这类键名追加到FormData里,但MVC的模型绑定器期望的是details.firstname(或者details[firstname])这样的键名,只有这样它才能把值映射到personfoods.details.firstname这个嵌套属性上。
解决方案:调整FormData的键名格式
只需要修改你追加details属性的代码,给每个属性键名加上details.前缀就行,具体修改如下:
修改后的jQuery代码
function addstudent() { var form= $("#studentform").valid(); if (form) { personfood.details.firstname = $("#firstname").val(); personfood.details.lastname = $("#lastname").val(); personfood.details.imageuploaded = $("#imageupload")[0].files[0]; personfood.details.rememberme = $("#rememberme").is(":checked"); personfood.details.newsletter = $("#newsletter").is(":checked"); personfood.details.gender = $("input[name='gender']").val(); var personfoods = new FormData(); // 关键修改:给details的属性加上"details."前缀 $.each(personfood.details, function (key, value) { personfoods.append("details." + key, value); }); $.each(personfood.foodname, function (key, value) { personfoods.append("foodname["+key+"]", value); }); for (var pair of personfoods.entries()) { console.log(pair[0] + ', ' + pair[1]); // 现在会输出类似 "details.firstname, xxx" 的字段,绑定器能识别了 } $.ajax({ url: "/Main/addperson", type: "POST", processData: false, cache: false, contentType: false, dataType: "json", data: personfoods, success: onsucessinsert, error: onerrorinsert }) } }
为什么这样能行?
MVC的模型绑定器会根据请求字段名和ViewModel的属性路径匹配:
- 当它看到
details.firstname这个字段时,会自动定位到personfoods对象下的details属性,再把值赋值给details的firstname属性 - 你的
foodname数组格式是对的,所以之前能正常接收,不需要改动
额外说明
- 对于文件上传字段
imageuploaded,修改后的键名是details.imageuploaded,和ViewModel中details的imageuploaded属性名完全匹配,绑定器能正确识别并绑定为HttpPostedFileBase对象 - 你也可以用
details[key]的格式(比如details[firstname]),效果和details.firstname一致,MVC绑定器两种格式都支持
这样修改后,控制器应该就能正常接收完整的personfoods对象了,包括嵌套的details和foodname数组。
内容的提问来源于stack exchange,提问作者ahmedshah
相关产品推荐
相关产品推荐

