如何向包含多模型类参数的控制器Action发送带数据的Ajax请求并完成模型绑定
解决ASP.NET MVC嵌套模型的Ajax绑定问题
你遇到的核心问题是ASP.NET MVC的模型绑定器对嵌套对象的参数格式有特定要求——虽然你指定了目标模型名称,但jQuery默认的表单序列化格式没办法让绑定器正确识别嵌套属性,才导致orderModel的内部字段全为null。下面给你两个实用的解决方案:
方案一:构造符合绑定规则的表单格式数据
ASP.NET MVC要求嵌套对象的参数名遵循「父属性.子属性」的格式,你只需要给每个字段的键名加上orderModel.前缀即可:
function EditModalOnComplete() { var modelData = { "orderModel.Data": "euro", "orderModel.Type": null, "orderModel.PosNumber": 0, "orderModel.OrderNumber": 0, "orderModel.ServerName": "serverDefualted" }; $.ajax({ url: '@Url.Action("SearchResult", "Orders")', data: modelData, success: function () { }, error: function (xhr, ajaxOptions, thrownError) { alert(xhr.responseText); } }); }
这种方式下,发送的参数会被模型绑定器直接映射到BindedModels中的orderModel属性里。
方案二:发送JSON格式数据(更推荐)
如果你的模型结构复杂,手动加前缀会很繁琐,这时候可以把数据序列化为JSON字符串,同时设置Ajax请求的contentType为application/json,让MVC用JSON绑定器解析:
function EditModalOnComplete() { var modelData = { Data: "euro", Type: null, PosNumber: 0, OrderNumber: 0, ServerName: "serverDefualted" }; var modelName = { "orderModel": modelData }; $.ajax({ url: '@Url.Action("SearchResult", "Orders")', type: "POST", // 复杂嵌套对象建议用POST,GET请求不适合传递JSON格式数据 contentType: "application/json; charset=utf-8", data: JSON.stringify(modelName), success: function () { }, error: function (xhr, ajaxOptions, thrownError) { alert(xhr.responseText); } }); }
这个方案不需要手动调整字段命名,直接用嵌套对象序列化即可,MVC会自动完成属性映射,代码更简洁易维护。
额外小提示
- 你的C#模型类命名不符合约定,建议把
orderModel改成OrderModel(首字母大写),虽然不影响绑定,但遵循规范能提升代码可读性; - 确保JS中的键名和C#模型的属性名一致(ASP.NET MVC默认不区分大小写,但保持一致能避免意外问题)。
内容的提问来源于stack exchange,提问作者moe1792
相关产品推荐
相关产品推荐

