Asp.net Core中Controller无法接收Model列表问题求助
排查Asp.Net Core中Ajax提交OrderProducts列表无法被Controller接收的问题
以下是针对该问题的逐一排查点及解决方法:
1. 验证模型属性的可访问性与命名匹配
- 确保
OrderProducts类的目标属性为public且包含get/set方法,示例:public class OrderProducts { public int ProductId { get; set; } public int Quantity { get; set; } // 其他需绑定的属性... } - 前端提交的字段名必须与模型属性名完全匹配(Asp.Net Core默认大小写敏感),比如前端传
productId无法绑定到模型的ProductId,需统一命名格式。
2. 修正Ajax请求的核心配置
- 必须指定
contentType为JSON格式,同时用JSON.stringify()序列化提交的数组,示例:// 构造选中的产品列表 var selectedProducts = [ { ProductId: 1, Quantity: 2 }, { ProductId: 3, Quantity: 1 } ]; $.ajax({ url: '/PurchaseOrder/AddProduct', type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify(selectedProducts), success: function(res) { // 处理成功逻辑 }, error: function(xhr) { // 处理错误 } }); - 不要添加
traditional: true配置,该配置适用于旧版表单数组格式,与JSON数组不兼容。
3. 配置Controller Action的参数特性
- 在Action参数上添加
[FromBody]特性,明确告知框架从请求体读取JSON数据:[HttpPost] public IActionResult AddProduct([FromBody] List<OrderProducts> orderProducts) { if (!ModelState.IsValid) { // 输出绑定错误用于排查 var errors = ModelState.SelectMany(x => x.Value.Errors.Select(e => e.ErrorMessage)); return BadRequest(errors); } // 业务处理逻辑 return Ok(); } - 参数类型需与前端提交的结构匹配,使用
List<OrderProducts>或IEnumerable<OrderProducts>接收数组。
4. 排查模型验证与请求日志
- 检查
ModelState.IsValid状态,若为false,直接返回绑定错误信息,快速定位字段不匹配问题。 - 查看Asp.Net Core请求日志,确认请求体的JSON格式是否正确(有无语法错误、多余逗号等)。
5. 处理Anti-Forgery Token(若启用)
- 若项目启用了防伪造验证,需在Ajax请求中携带Token:
在View中添加Token:
在Ajax请求中添加请求头:@Html.AntiForgeryToken()
同时在Controller Action上添加headers: { RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() }[ValidateAntiForgeryToken]特性。
内容的提问来源于stack exchange,提问作者Kashif Shahzad
相关产品推荐
相关产品推荐

