ASP.NET Core Web API控制器接收Ajax对象列表参数为空问题排查
解决.NET Core 5中Ajax传递对象列表到控制器的参数为空问题
问题根源
你当前使用application/x-www-form-urlencoded格式传递复杂对象列表,.NET Core的模型绑定规则与旧版ASP.NET MVC不同,加上前端传递格式不符合.NET Core的解析要求,导致参数无法被正确绑定。
修正方案
提供两种可行方案,可根据需求选择:
方式一:改用JSON格式传递(推荐)
这种方式更适配复杂对象的传递,步骤如下:
修改控制器代码
移除[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的属性名需与前端传递的键名一致(大小写不敏感,但建议保持风格统一)。
修改前端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模型绑定要求格式化列表参数:
修改前端数据格式
将列表转换为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();控制器代码调整
保留[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
相关产品推荐
相关产品推荐

