.NET 6 MVC Ajax POST大数组时控制器接收参数为null
问题根因
这个问题和POST请求总内容长度无关,是*.NET 6 MVC默认表单模型绑定的条目数量阈值限制*导致的。
你当前的jQuery $.ajax 默认使用 application/x-www-form-urlencoded 格式提交数据,传递数组时会把每个数组元素序列化为独立的inputData=xxx键值对放在请求体中。.NET 6的FormOptions默认配置中,ValueCountLimit默认值为1024,即单次表单提交最多允许解析1024个键值对。当你的数组条目数超过这个阈值时,表单解析器会直接放弃绑定集合类型参数,全程不会抛出异常,最终表现就是Action里的inputData参数直接为null。
你之前配置的MaxRequestBodySize、web.config中的请求总长度限制,仅约束整个请求体的字节大小上限,不涉及表单键值对的数量限制,所以配置后无法解决问题。你测试时把整个数组序列化为单个字符串传参能成功,本质是把N个键值对压缩为1个键值对,绕开了这个数量限制,刚好印证了这个根因。
解决方案
二选一即可,优先推荐方案2:
- 方案1:调整表单绑定阈值,保留现有传参格式
不需要修改前端代码,在Program.cs中调整表单配置的默认限制,把阈值调到匹配业务需求的大小即可:
如果不想全局修改配置,也可以单独给对应接口加特性,仅对该接口生效:builder.Services.AddControllersWithViews(options => { // 按自身业务最大数据量调整数值 options.FormOptions.ValueCountLimit = 10000; // 如果单条字符串内容较长,可同步调整单值长度限制 options.FormOptions.ValueLengthLimit = int.MaxValue; options.FormOptions.KeyLengthLimit = int.MaxValue; });[HttpPost] [RequestFormLimits(ValueCountLimit = 10000, ValueLengthLimit = int.MaxValue)] public JsonResult LoadData(List<string> inputData) { var success = db.ProcessData(inputData); return Json(new { Success = success }); } - 方案2:改用JSON格式提交请求(推荐)
form-urlencoded格式本身不适合传递大数组,不仅冗余度高传输效率低,还容易碰到各种绑定阈值限制。你可以把前端请求的Content-Type改为application/json,直接将整个数据序列化为JSON字符串提交,后端不需要修改参数类型就能正常绑定,也不会触发表单值数量限制。
前端代码修改如下:$.ajax({ type: "POST", url: '@Url.Action("LoadData", "myController")', contentType: "application/json; charset=utf-8", data: JSON.stringify(data), success: function(response) { }, failure: function(response) { debugger; }, error: function(response) { debugger; } });
内容的提问来源于stack exchange,提问作者Rémy
相关产品推荐
相关产品推荐

