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

AJAX传递数组至ASP.NET Controller始终为null的问题求助

解决AJAX向ASP.NET Controller传递数组时获取null的问题

看起来你遇到的问题大概率是ASP.NET MVC模型绑定的限制加上请求格式不匹配导致的,结合你的代码和另一个视图正常的情况,我整理了几个关键排查点和解决方案:

1. 核心问题:多个复杂类型参数的模型绑定限制

ASP.NET MVC(非Core版本)默认只能从请求体中绑定一个复杂类型参数,你的Controller方法同时接收两个数组类型(PaintballItemQuantity[]和EventOtherOption[])和一个int参数,这种情况下模型绑定无法正确解析多个复杂类型,直接导致参数为null。而你另一个视图能正常工作,很可能是那个视图的Controller方法参数结构不同(比如用单个ViewModel封装了所有参数)。

解决方案:封装请求参数到单个ViewModel

创建一个专门的请求模型类,把所有参数打包进去:

public class CountAdditionalSellPriceRequest
{
    public PaintballItemQuantity[] piq_tab { get; set; }
    public EventOtherOption[] eoo_tab { get; set; }
    public int VAT { get; set; }
}

然后修改Controller方法,使用这个ViewModel并加上[FromBody]特性(确保从请求体读取完整的JSON数据):

[HttpPost]
public decimal CountAdditionalSellPrice([FromBody] CountAdditionalSellPriceRequest request)
{
    // 这里可以使用 request.piq_tab、request.eoo_tab 和 request.VAT
    // 你的业务逻辑代码...
}

2. 调整AJAX请求格式为JSON

默认情况下,$.ajax会把数据编码为application/x-www-form-urlencoded格式,这种格式对于嵌套对象数组的支持很差。需要改成JSON格式传递数据:

修改你的AJAX代码:

$.ajax({
    type: "POST",
    dataType: "json",
    async: false,
    url: "/EventNotes/CountAdditionalSellPrice",
    contentType: "application/json; charset=utf-8", // 新增:指定请求内容类型为JSON
    data: JSON.stringify({ piq_tab: primary2, eoo_tab: additional2, VAT: vat }), // 把数据转为JSON字符串
    success: function (data) {
        $("#Note_AdditionalSellsCost").val(data);
    },
    error: function(xhr, status, error) {
        // 新增错误处理,方便排查问题
        console.log("请求错误详情:", xhr.responseText);
    }
});

3. 检查数据类型匹配问题

从你的示例数据看,前端传递的ID是字符串类型(比如"8"),但ViewModel里的ID是int类型——虽然默认模型绑定会尝试转换,但如果有转换失败的情况,也可能导致整个数组为null。另外,Price字段前端传的是"1,00"(逗号作为小数分隔符),而ASP.NET默认的模型绑定使用点作为小数分隔符,这也可能导致EventOtherOption对象绑定失败。

排查建议:

  • 把前端的数字类型字段(ID、Quantity、Price)转为数值类型后再传递:
    // 构造primary2时:
    var x = { 
        ID: parseInt(primary[i]), 
        Name: primary[i + 1], 
        Quantity: parseInt(primary[i + 2]) 
    };
    // 构造additional2时:
    var x = { 
        ID: parseInt(additional[i]), 
        EventID: parseInt(additional[i + 1]), 
        Name: additional[i + 2], 
        Price: parseFloat(additional[i + 3].replace(",", ".")), // 替换逗号为点,适配后端格式
        Quantity: parseInt(additional[i + 4]) 
    };
    

4. 检查数组构造逻辑

你的additional数组循环条件是i < additional.length - 1,如果additional的长度刚好是6的倍数,这个条件没问题,但如果长度不是,可能会少处理最后一组数据。可以改成i < additional.length,同时确保每次循环处理的元素数量正确(比如6个),避免数组越界。

按照上面的步骤修改后,应该就能正常绑定参数了。如果还是有问题,可以打开浏览器的开发者工具,查看Network标签里的请求内容,确认JSON数据格式是否正确,以及后端返回的错误信息(通过新增的error回调查看)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:51:37