Ajax传递数组至.NET WebApi Controller始终长度为0,求问题原因
问题分析与解决方案
嗨,我帮你找到了控制器接收不到数组的核心原因——数据格式与请求内容类型不匹配,导致WebAPI的模型绑定无法正确识别数组参数。
为什么会出现这个问题?
你当前的Ajax请求里,data: { id: arr }会被jQuery默认序列化为form-urlencoded格式(比如id=1&id=2&id=3或id[]=1&id[]=2&id[]=3,取决于jQuery版本)。但WebAPI的默认模型绑定规则对POST请求的这种格式并不友好,它无法自动将多个同名参数绑定到int[] id参数上,所以你拿到的数组始终是空的。
推荐解决方法
直接发送JSON格式的数据,并明确指定请求的contentType为application/json,这样WebAPI就能正确解析数组了:
修改后的Ajax代码:
var arr = [1, 2, 3]; $.ajax({ url: "http://localhost:14506/api/Lanche/Montar", type: "POST", data: JSON.stringify({ id: arr }), // 将对象转为标准JSON字符串 dataType: "json", contentType: "application/json", // 关键:告诉服务器请求体是JSON格式 // async: false, 建议移除这个配置,同步请求会阻塞浏览器主线程,影响用户体验 success: function (data) { alert(data); } });
控制器方法可以保持原样,或者加上[FromBody]特性让绑定逻辑更明确(可选,但推荐):
public decimal Montar([FromBody] int[] id) { if (id != null) { // 业务代码 } return 0; }
额外提示
- 尽量避免使用
async: false,同步Ajax请求会导致页面假死,严重影响用户体验。 - 如果坚持要用
form-urlencoded格式传递数组,需要修改WebAPI的配置添加自定义模型绑定规则,但这种方式繁琐且不直观,远不如发送JSON简洁可靠。
内容的提问来源于stack exchange,提问作者NIZZOLA
相关产品推荐
相关产品推荐

