You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:57:19