如何将对象类型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
相关产品推荐
相关产品推荐

