Ajax POST到.NET Core MVC控制器无法正确绑定ViewModel参数求助
问题根因
两种实现的绑定失败都来自核心逻辑错误:
serialize()方法返回的是x-www-form-urlencoded格式的扁平字符串(格式为字段1=值1&字段2=值2),不是MST_ProductViewModel类型的结构化对象。把这个字符串直接赋值给MST属性,不管是做JSON序列化还是表单提交,后端都无法把纯字符串解析成嵌套的视图模型对象。- 第一版实现中,下拉框通过
val()拿到的选中值默认是字符串类型,和后端定义的List<int>类型不匹配,也会触发绑定失败。 - 第二版实现未遵循默认模型绑定的参数命名规则,嵌套属性没有加层级前缀,后端无法识别MST下的各字段归属。
解决方案
二选一即可,推荐优先用JSON提交方案。
方案1:JSON提交(适配[FromBody]特性)
实现逻辑:把表单数据转成结构化对象赋值给MST,FoodsID值转为数字类型,序列化后以JSON格式提交。
修正后的前端代码:
function post() { // 把表单序列化为键值对数组,组装为MST对应的结构化对象 const formItemList = $("#CreateProductForm").serializeArray(); const mstObj = {}; formItemList.forEach(item => { mstObj[item.name] = item.value; }); // 组装FoodsID数组,值转为整数匹配后端List<int>类型 const foodsIdList = []; $("select[name='FoodsID']").each(function () { const val = $(this).val(); if (val) foodsIdList.push(parseInt(val)); }); // 构造完整提交参数 const submitData = { MST: mstObj, FoodsID: foodsIdList }; $.ajax({ type: "POST", url: "CreateProduct", data: JSON.stringify(submitData), dataType: "json", contentType: 'application/json; charset=utf-8', success: function (response) { // 业务成功处理 }, error: function (err) { // 异常处理 } }); }
后端Action写法:
[HttpPost] public IActionResult CreateProduct([FromBody] ProductViewModel model) { // 业务逻辑 }
方案2:默认表单提交(无需[FromBody])
实现逻辑:遵循ASP.NET Core表单绑定的命名规则,MST下的所有字段名添加MST.前缀,直接提交表单格式数据。
修正后的前端代码:
function post() { const formItemList = $("#CreateProductForm").serializeArray(); const submitData = {}; // 给所有MST下的字段加前缀 formItemList.forEach(item => { submitData[`MST.${item.name}`] = item.value; }); // 组装FoodsID参数 submitData.FoodsID = []; $("select[name='FoodsID']").each(function () { const val = $(this).val(); if (val) submitData.FoodsID.push(parseInt(val)); }); $.ajax({ type: "POST", url: "CreateProduct", data: submitData, dataType: "json", success: function (response) { // 业务成功处理 }, error: function (err) { // 异常处理 } }); }
后端Action写法:
[HttpPost] public IActionResult CreateProduct(ProductViewModel model) { // 业务逻辑 }
校验提示
提交前可在浏览器控制台打印submitData,确认两个核心规则:
MST属性是键值对结构的对象,不是字符串FoodsID数组内的元素是数字类型,不是字符串
确认结构正确后再发起请求即可正常绑定。
内容的提问来源于stack exchange,提问作者HoBun Cheung
相关产品推荐
相关产品推荐

