ASP.NET如何接收JS提交的列表数据,通过控制器存入数据库(含Task<IHttpActionResult>示例)
问题定位
你当前代码存在3个核心问题导致功能失效:
- 前后端传参结构不匹配:前端序列化的JSON结构是
{"things": [数组]},但后端直接接收List<DataDTO>,模型绑定无法正确解析数据 - 控制器参数缺少
[FromBody]特性:ASP.NET接收application/json格式的POST请求时,需要显式标注从请求体读取数据 - 逻辑错误:你遍历的是自己初始化的空列表
results,完全没有用到前端传过来的参数,循环不会执行任何操作
修正方案
方案1:修改后端适配现有前端代码
首先新增一个接收参数的包装类:
public class UpdateDataRequest { public List<DataDTO> things { get; set; } }
然后修改控制器代码:
[HttpPost] public async Task<IHttpActionResult> UpdateData([FromBody] UpdateDataRequest request) { // 直接遍历前端传过来的things数组 foreach (var item in request.things) { var newRecords = new newData(); newRecords.ID = item.ID; newRecords.QUANTITY = item.QUANTITY; newRecords.CODE = item.CODE; newRecords.DESCRIPTION = item.DESCRIPTION; db.newData.Add(newRecords); } await db.SaveChangesAsync(); return Ok("Save successfully"); }
方案2:修改前端适配现有后端参数
如果不想改后端代码,就把前端序列化部分的外层包装去掉:
// 原来的写法是包了一层things,改成直接序列化数组 things = JSON.stringify(things);
然后控制器代码修改为:
[HttpPost] public async Task<IHttpActionResult> UpdateData([FromBody] List<DataDTO> data) { foreach (var item in data) { var newRecords = new newData(); newRecords.ID = item.ID; newRecords.QUANTITY = item.QUANTITY; newRecords.CODE = item.CODE; newRecords.DESCRIPTION = item.DESCRIPTION; db.newData.Add(newRecords); } await db.SaveChangesAsync(); return Ok("Save successfully"); }
额外注意点
- 建议添加入参校验,判断接收的数组是否为空,避免空引用异常
- 如果是.NET Core版本的ASP.NET,
IHttpActionResult可以替换为IActionResult,用法基本一致
内容的提问来源于stack exchange,提问作者Dev1022
相关产品推荐
相关产品推荐

