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

AJAX调用向.NET Controller传递List<>参数为空问题排查

问题原因

你前端AJAX传递的JSON结构和后端控制器期望的参数结构不匹配:

  • 后端用[FromBody] List<AccountUser> users,期望接收直接的JSON数组(格式示例:[{...}, {...}])
  • 但你前端序列化的是包含users键的嵌套对象(格式示例:{users: [{...}, {...}]}),导致模型绑定无法匹配,最终users参数为空。
解决方法

方法一:修改前端AJAX代码(推荐)

直接序列化users数组,无需包裹在额外对象中:

function generatePDF() {
  var users = [];
  var table = new DataTable("#dashboardTbl");
  table
    .rows({
      selected: true,
    })
    .every(function (rowIdx, tableLoop, rowLoop) {
      var data = this.data();
      users.push({
        UserId: Number(data[6]),
        Username: data[2],
        LinkedAccountId: data[7],
        AccountName: data[3],
        CAC_EDIPI: Number(data[8]),
      });
    });

  // 直接序列化users数组,去掉外层的users键
  var jsonData = JSON.stringify(users);

  $.ajax({
    type: "POST",
    url: "/APM/File/GeneratePassword",
    data: jsonData,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    error: function (jqXHR, textStatus, errorThrown) {
      $("#loading-overlay").fadeOut();
      alert("Unable to generate passwords and documents. " + errorThrown);
    },
  }).done(function (data) {
    alert(
      "Password has been generated and documents have been emailed to account users."
    );
  });
}

方法二:修改后端代码(适配现有前端结构)

创建专门的接收模型类,匹配前端传递的JSON结构:

// 新增接收模型类
public class UserListRequest
{
    public List<AccountUser> Users { get; set; }
}

// 修改控制器方法参数
[HttpPost]
public bool GeneratePassword([FromBody] UserListRequest request)
{
    bool success = false;
    var users = request?.Users;

    success = users != null && users.Count > 0;

    if (success)
    {
        var userEdipis = users.Select(x => x.CAC_EDIPI).ToArray();

        foreach (int edipi in userEdipis)
        {
            List<AccountUser> allUserAccounts = users.FindAll(p => p.CAC_EDIPI == edipi);
            CreateLetter(allUserAccounts, edipi);
        }
        return true;
    }
    else
    {
        return false;
    }
}
额外检查点
  • 确保AccountUser类的属性名称和前端JSON键完全匹配(大小写敏感,比如CAC_EDIPI需前后端一致)
  • 确认CAC_EDIPI类型匹配:后端为int时,前端需传递数字而非字符串(你已用Number(data[8])处理,此点没问题)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:18:28