ASP.NET MVC中POST传递JSON数组至ActionResult时参数为null问题
解决ASP.NET MVC POST请求中数组参数为Null的问题
我来帮你排查并解决这个问题,你的情况主要有两个核心原因:AntiForgeryToken未在AJAX请求中传递,以及JS中数组维度与控制器参数不匹配,下面一步步来修复:
1. 必须传递AntiForgeryToken
你的Submit方法加了[ValidateAntiForgeryToken]特性,但当前AJAX请求里没有携带这个令牌——这不仅可能导致参数绑定失败,甚至会直接触发请求验证错误(400 Bad Request)。
修复方式:
先确保视图中存在@Html.AntiForgeryToken()(可以放在表单内或页面任意位置),然后在AJAX请求中添加令牌参数:
var tag = ["Incident Type 1", "Incident Type 2"]; // 先调整数组结构,后面解释原因 $('#SubmitBtn').click(function (e) { e.preventDefault(); $.ajax({ type: "POST", dataType: "json", url: "@Url.Action("Submit", "YourActualControllerName")", // 替换成你的真实控制器名 traditional: true, data: { name: tag, __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() }, success: function (msg) { alert(msg) } }); });
2. 匹配数组维度(核心问题)
你当前JS里的tag是二维数组:[["Incident Type 1"],["Incident Type 2"]],但控制器接收的是一维字符串数组string[] name——ASP.NET MVC的模型绑定无法自动将二维数组转换为一维,所以参数会返回null。
两种修复方案:
方案A:修改JS数组为一维数组(推荐,适配现有控制器参数)
直接把tag改成一维结构,这是最简单的适配方式:
var tag = ["Incident Type 1", "Incident Type 2"];
结合上面的AJAX修改,控制器的string[] name就能正常接收到值了。
方案B:修改控制器参数为二维数组(如果业务需要保留二维结构)
如果你的业务逻辑确实需要传递二维数组,那么把控制器的参数改成二维字符串数组:
// POST [HttpPost] [ValidateAntiForgeryToken] [Authorize(Roles = "Student")] public ActionResult Submit(string[][] name) // 改为二维数组 { // 你的业务处理逻辑 return RedirectToAction("Index", "Home"); }
同时JS里保持原二维数组,AJAX里的traditional:true要保留,这样模型绑定就能正确识别二维数组了。
3. 额外注意点
- 确保
@Url.Action("Submit", "YourActualControllerName")中的控制器名称是真实存在的(比如控制器是HomeController,这里就写"Home")。 - 因为你用的是AJAX请求,控制器返回
RedirectToAction不会自动触发前端跳转,如果需要跳转,可以修改控制器返回JSON告知跳转地址:
public ActionResult Submit(string[] name) { return Json(new { redirectUrl = Url.Action("Index", "Home") }); }
然后在JS的success回调中处理跳转:
success: function (data) { window.location.href = data.redirectUrl; }
内容的提问来源于stack exchange,提问作者Bumblebeeee
相关产品推荐
相关产品推荐

