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

如何将对象类型JSON数组传入MVC控制器?参数接收为null

解决MVC控制器接收JSON数组为null的问题

我帮你排查了代码里的几个关键问题,这些都是导致控制器参数dashboards始终为null的核心原因,一步步来修正:

1. AJAX数据传递格式错误

你已经设置了contentType: "application/json",这意味着必须直接发送JSON字符串,而不是把JSON字符串包裹在一个对象里。当前你的data写法会让后端无法正确解析请求体内容。

修改后的AJAX数据部分:

// 因为控制器接收的是List<Dashboard>,所以要把单个对象包装成数组再转JSON
data: JSON.stringify([dashboards]),

如果你实际只需要传递单个Dashboard对象,也可以把控制器的参数改成Dashboard dashboards,这时候前端直接传JSON.stringify(dashboards)即可。

2. 前后端属性名不匹配(模型绑定核心问题)

MVC的模型绑定完全依赖属性名一致,你的前端对象和后端实体类有多处不匹配:

  • 前端的DashboardName对应后端Dashboard类的Name,需要统一命名;
  • 前端DashboardCell里的DashWidth/DashHeight对应后端DashboardCell类的Width/Height,需重命名对齐;
  • 前端previousElementSibling是字符串(可能为空),但后端定义为int类型,类型不匹配会直接导致绑定失败;
  • 后端Dashboard类的UserID属性前端未传递,要么前端补上值,要么后端设为可空类型。

修改后的前端对象属性:

// 顶层Dashboard对象调整属性名
var dashboards = {
    "Name": '', // 改为和后端一致的Name
    "Width": '',
    "Height": '',
    "UserID": 1, // 补上UserID,根据实际业务赋值
    "DashboardCell": [
        {
            "DashCellId": '',
            "x": '',
            "y": '',
            "Width": '', // 改为Width,对应后端DashboardCell的Width
            "Height": '', // 改为Height,对应后端的Height
            "colspan": '',
            "rowspan": '',
            "Active": '',
            "CellValue": '',
            "cellClass": '',
            "previousElementSibling": ''
        }
    ]
};

// 循环生成DashCell时也要同步修改属性名
var DashCell = {
    DashCellId: DashCellID,
    x: x,
    y: y,
    Width: DashWidth, // 改为Width
    Height: DashHeight, // 改为Height
    colspan: colspan,
    rowspan: rowspan,
    Active: true, // 改为布尔值,和后端bool类型匹配
    CellValue: CellValue,
    cellClass: cellClass,
    previousElementSibling: previousElementSibling
};

修改后的后端实体类:

public class DashboardCell
{
    public int Width { get; set; }
    public int Height { get; set; }
    public bool Active { get; set; }
    public int colspan { get; set; }
    public int rowspan { get; set; }
    public int x { get; set; }
    public int y { get; set; }
    public string CellValue { get; set; }
    public string DashCellId { get; set; }
    public string cellClass { get; set; }
    public string previousElementSibling { get; set; } // 改为string类型,匹配前端
}
public class Dashboard
{
    public string Name { get; set; }
    public int Height { get; set; }
    public int Width { get; set; }
    public int? UserID { get; set; } // 改为可空int,避免前端未传值时绑定失败
    public List<DashboardCell> DashboardCell { get; set; }
}

3. 可选:添加[FromBody]特性

在控制器参数上加上[FromBody],明确告知MVC从请求体中解析数据,这能避免一些隐性的绑定问题:

[HttpPost]
[SiteAuthorize]
public ActionResult SaveDashboard([FromBody] List<Dashboard> dashboards)
{
    // 原有逻辑不变
}

把这些修改完成后,再测试就能正常接收到前端传递的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:24:30