ASP.NET MVC POST请求后控制器接收参数为空问题排查
问题描述
尝试发送一个包含约600个Customer类型对象的数组,Customer类定义如下:
public class Customer { int ID {get; set;} string Name {get; set;} string LastName {get; set;} }
前端通过JavaScript的AJAX发送数据,代码如下:
function ExecuteSendCustomerData(customers) { $.ajax({ type: "POST", dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=UTF-8', data: JSON.stringify(customers), url: "/MyHomeController/SendCustomerDataToBackend", }); }
后端HomeController中的方法定义如下:
[HttpPost] public void SendCustomerDataToBackend(string myJsonData) // 该参数始终为null { var deserializedNodeData = JsonSerializer.Deserialize<IEnumerable<Customer>>(myJsonData); //...后续处理逻辑 }
已确认前端调用ExecuteSendCustomerData时,customers参数包含600条有效数据,但控制器中的myJsonData始终为null,请问问题出在哪里?
问题原因与修复方案
1. 请求内容类型与数据格式不匹配
当前AJAX设置的contentType是application/x-www-form-urlencoded,但发送的是JSON.stringify(customers)生成的纯JSON字符串。后端默认不会将这种格式的请求体解析为string类型参数,导致myJsonData为null。
修复方法:
将AJAX的contentType改为application/json; charset=UTF-8,让后端正确识别请求体中的JSON数据。修改后的JS代码:
function ExecuteSendCustomerData(customers) { $.ajax({ type: "POST", dataType: 'json', contentType: 'application/json; charset=UTF-8', // 修改此处 data: JSON.stringify(customers), url: "/MyHomeController/SendCustomerDataToBackend", }); }
2. 后端参数接收方式问题
即使修改了contentType,直接用string myJsonData接收仍可能存在问题(.NET默认会尝试将JSON直接绑定到强类型对象,而非原始字符串)。有两种处理方式:
方式一:直接接收强类型集合(推荐)
省去手动反序列化步骤,直接让框架完成绑定:
[HttpPost] public void SendCustomerDataToBackend(IEnumerable<Customer> customers) { // 直接使用customers集合进行后续处理 }
方式二:接收原始JSON字符串
给参数添加[FromBody]特性,明确告诉框架从请求体中读取原始JSON内容:
[HttpPost] public void SendCustomerDataToBackend([FromBody] string myJsonData) { var deserializedNodeData = JsonSerializer.Deserialize<IEnumerable<Customer>>(myJsonData); //...后续处理逻辑 }
3. 额外检查点
- 确认路由是否正确:若控制器类名为
HomeController,路由通常应为/Home/SendCustomerDataToBackend,而非/MyHomeController/...,避免路由不匹配导致请求未命中目标方法。 - 检查请求体大小限制:600条对象的数据量可能触发后端的请求体大小限制,若出现413错误,需在配置中调整最大请求体限制参数。
内容的提问来源于stack exchange,提问作者user2529011
相关产品推荐
相关产品推荐

