ASP.NET MVC 5 提交主从视图到Controller时子集合绑定为null问题求助
问题根因
- 提交JSON时没有指定请求的
contentType为application/json,服务端模型绑定器无法正确识别JSON格式的请求体 - 前端提交的明细对象属性名与C#类定义不匹配:
CustomerOrderDetail类中商品属性名为prod,你前端传的是Product.ProductID,属性名不匹配导致绑定失败 - 原jQuery选择器存在语法错误:
$('table tbody tr)')多了一个多余的右括号,可能导致明细收集不完整 - 大概率漏了在提交前调用
CollectDetail方法,导致listDetail始终是空数组
解决方案
1. 修正Controller代码
给Action参数加上[FromBody]特性,指示模型绑定器从请求体中读取JSON数据进行绑定:
// ASP.NET Core必须加该特性,ASP.NET Framework环境可跳过 public ActionResult Create([FromBody] CustomerOrder data) { }
2. 修正前端JS代码
var listDetail = []; function CollectDetail() { listDetail = []; // 每次收集前清空列表,避免重复追加旧数据 // 修正选择器语法错误 $('table tbody tr').each(function (idx, item) { listDetail.push({ // 匹配C#类中的属性名prod "prod.ProductID": $('select[name="Product.ProductID"]', this).val(), "Qty": parseInt($('input[name="Qty"]', this).val()), // 显式转数值避免绑定失败 "Price": parseFloat($('input[name="Price"]', this).val()) // 显式转数值避免绑定失败 }); }); } function Submit() { CollectDetail(); // 提交前必须调用明细收集方法 var datas = { "CustomerID": $('#customerID').val(), "VBranch.BranchCode": $('#VBranch_BranchCode').val(), "TransDate": moment($('#TransDate').val(), "DD/MMM/YYYY").format("YYYY-MM-DD"), "OrderDetails": listDetail }; $.ajax({ type: "POST", dataType: 'JSON', // 新增指定请求内容类型为JSON contentType: 'application/json; charset=utf-8', data: JSON.stringify(datas), url: '@Url.Action("Create", "CustomerOrder")', success: function (result) { alert('Success'); }, error: function (status, xhr, tokek) { console.log(status.responseText); alert('Failed'); } }); }
额外排查点
如果修改后还是绑定失败,可以检查以下内容:
- 确认
Product类中的ProductID属性名拼写正确,和前端提交的一致 - 确认明细条目的
Qty和Price没有传入空值、非数字格式的内容,避免类型不匹配导致整条明细绑定失效 - 如果不想用JSON提交,也可以去掉
JSON.stringify和contentType配置,直接传入datas对象,用默认的表单格式提交也可以正常绑定
内容的提问来源于stack exchange,提问作者Blishton
相关产品推荐
相关产品推荐

