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

ASP.NET Core MVC 如何通过Ajax向控制器传递嵌套模型数据

错误原因与修正方案

1. 控制器端空引用异常

trnPurchaseOrderLists类中的Items是mfItems类型的引用类型属性,实例化trnPurchaseOrderLists时,该属性的默认值为null。直接执行hey.Items.ItemID = id时,会触发空引用报错,控制器无法正常携带Items对象的序列化数据返回前端,这也是为什么你观察到“移除嵌套值打印语句后,只有Quantity字段能正常工作”的核心原因——Quantity是decimal类型的值类型,无需提前实例化也不会触发报错。
修正方式:在实例化trnPurchaseOrderLists时,同步初始化嵌套的Items对象。

2. 前端读取返回值的大小写匹配问题

ASP.NET Core MVC 默认使用System.Text.Json完成JSON序列化,默认规则是将PascalCase命名的C#属性转换为camelCase格式输出。mfItems类中的ItemID属性序列化后,对应的前端字段名为itemId,而非代码中写的全小写itemid,因此会出现读取值为undefined的问题。

修正后完整可运行代码

控制器代码

[HttpPost]
public trnPurchaseOrderLists ChangeQuantity(string id, decimal value)
{
    trnPurchaseOrderLists hey = new trnPurchaseOrderLists
    {
        Items = new mfItems(),
        Quantity = value
    };
    hey.Items.ItemID = id;
    return hey;
}

前端Ajax代码

function change_quantity(id) {
    var value = $('#' + id).val();
    $.ajax({
        type: "POST",
        url: "@Url.Action("ChangeQuantity")",
        data: { id: id, value: value },
        dataType: "json",
        success: function (data) {
            console.log(data.items.itemId);
            console.log(data.quantity);
        }
    });
}

可选优化配置

如果希望前端读取返回值时和C#模型属性名的大小写完全一致,可以在项目的Program.cs中调整JSON序列化规则,关闭默认的camelCase自动转换:

builder.Services.AddControllersWithViews()
    .AddJsonOptions(options =>
    {
        // 序列化输出的属性名和C#模型定义保持完全一致
        options.JsonSerializerOptions.PropertyNamingPolicy = null;
    });

配置完成后,前端可以直接使用data.Items.ItemID的方式读取嵌套模型的返回值,无需适配大小写规则。

内容的提问来源于stack exchange,提问作者Jeffrey Estrera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 00:24:03