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
相关产品推荐
相关产品推荐

