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

ASP.NET Core Web API控制器接收Ajax对象列表参数为空问题排查

解决.NET Core 5中Ajax传递对象列表到控制器的参数为空问题

问题根源

你当前使用application/x-www-form-urlencoded格式传递复杂对象列表,.NET Core的模型绑定规则与旧版ASP.NET MVC不同,加上前端传递格式不符合.NET Core的解析要求,导致参数无法被正确绑定。

修正方案

提供两种可行方案,可根据需求选择:

方式一:改用JSON格式传递(推荐)

这种方式更适配复杂对象的传递,步骤如下:

  1. 修改控制器代码
    移除[Consumes("application/x-www-form-urlencoded")]和[FromForm],改用[FromBody],同时创建统一的请求DTO类来接收参数:

    // 新增请求DTO类
    public class EditMultipleRequest
    {
        public List<Result> Results { get; set; }
        public string Comment { get; set; }
    }
    
    [HttpPost("EditMultipleResults")]
    public bool EditMultipleResults([FromBody] EditMultipleRequest request)
    {
        // 使用request.Results和request.Comment处理业务逻辑
        return true;
    }
    

    注意:DTO的属性名需与前端传递的键名一致(大小写不敏感,但建议保持风格统一)。

  2. 修改前端Ajax代码
    将数据转换为JSON字符串,设置contentType为application/json,移除traditional: true:

    var results = [
        {taskcd: 123, Runno: 187776876, Workorder: 'VA1234567'},
        {taskcd: 642, Runno: 187776877, Workorder: 'VA1234569'},
        {taskcd: 766, Runno: 187776876, Workorder: 'VA1234564'}
    ];
    
    var posteddata = {
        results: results,
        comment: 'test comment'
    };
    
    $.ajax({
        type: 'POST',         
        data: JSON.stringify(posteddata), // 转换为JSON字符串
        contentType: 'application/json; charset=utf-8', // 指定JSON格式
        url: 'api/ResultsEditor/EditMultipleResults',
        success: function () {
            deferred.resolve();
        },
        error: deferred.reject
    });
    return deferred.promise();
    

方式二:保持form-urlencoded格式,调整前端传递结构

如果必须使用application/x-www-form-urlencoded,需按照.NET Core模型绑定要求格式化列表参数:

  1. 修改前端数据格式
    将列表转换为results[0].taskcd、results[0].Runno这种带索引的键值对结构:

    var results = [
        {taskcd: 123, Runno: 187776876, Workorder: 'VA1234567'},
        {taskcd: 642, Runno: 187776877, Workorder: 'VA1234569'},
        {taskcd: 766, Runno: 187776876, Workorder: 'VA1234564'}
    ];
    
    var posteddata = {};
    // 遍历列表生成符合绑定要求的键值对
    results.forEach(function(item, index) {
        posteddata[`results[${index}].taskcd`] = item.taskcd;
        posteddata[`results[${index}].Runno`] = item.Runno;
        posteddata[`results[${index}].Workorder`] = item.Workorder;
    });
    posteddata.comment = 'test comment';
    
    $.ajax({
        type: 'POST',         
        data: posteddata,            
        contentType: 'application/x-www-form-urlencoded; charset=utf-8',          
        url: 'api/ResultsEditor/EditMultipleResults',
        success: function () {
            deferred.resolve();
        },
        error: deferred.reject
    });
    return deferred.promise();
    
  2. 控制器代码调整
    保留[FromForm]和Consumes特性,确保参数名与前端键名一致:

    [HttpPost("EditMultipleResults")]
    [Consumes("application/x-www-form-urlencoded")]
    public bool EditMultipleResults([FromForm] List<Result> results, [FromForm] string comment)
    {
        // 业务逻辑处理
        return true;
    }
    

查看传递给控制器的请求数据

使用浏览器开发者工具(Chrome/Firefox/Edge通用):

  • 按F12打开开发者工具,或右键页面选择「检查」。
  • 切换到Network标签页。
  • 触发Ajax请求,在请求列表中找到目标请求(URL包含EditMultipleResults)。
  • 点击该请求,查看Payload(Chrome)或Request Body(Firefox)标签,即可看到实际传递的参数内容。
  • 同时可查看Headers标签,确认Content-Type是否与设置一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:20:46