MVC控制器Action接收AJAX POST请求始终返回400错误求助
解决ASP.NET MVC中AJAX POST请求返回400错误的问题
你的POST请求返回400错误,核心原因有两个:缺少防伪令牌验证、请求数据格式不匹配导致模型绑定失败,以下是具体解决方案:
1. 补充防伪令牌验证
你的控制器Action添加了[ValidateAntiForgeryToken]特性,但AJAX请求未携带防伪令牌,这是400错误的最直接原因。
步骤:
- 在视图页面(如
DayTrial.cshtml)中添加防伪令牌:
@Html.AntiForgeryToken()
- 修改AJAX函数,在请求头中携带该令牌:
async function SaveTheDay(url, data) { if (data != null) { // 获取页面中的防伪令牌 const antiForgeryToken = $('input[name="__RequestVerificationToken"]').val(); $.ajax({ url: url, type: 'POST', dataType: "json", contentType: "application/json", // 指定请求内容为JSON格式 data: JSON.stringify(data), // 将JS对象序列化为JSON字符串 headers: { // 把防伪令牌放入请求头 "RequestVerificationToken": antiForgeryToken }, success: function (response) { console.log("Ok"); }, error: function (req, status, error) { console.log("error "+status+" "+error); } }) } }
2. 确保请求数据格式与模型匹配
默认情况下jQuery的$.ajax会把data对象转为form-urlencoded格式,但ASP.NET MVC绑定复杂模型时更适合JSON格式,因此必须设置contentType: "application/json"并将数据序列化为JSON字符串(JSON.stringify(data))。
3. 优化控制器返回(可选)
因为是AJAX请求,返回JsonResult比返回View更符合前端预期:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> SaveDay(InfoDay day) { // 这里添加你的业务逻辑,比如保存数据到数据库 return Json(new { success = true }); }
排查其他可能问题
- 打开浏览器开发者工具的Network标签,查看POST请求的
Payload是否和InfoDay类的属性完全匹配(注意数据类型:比如userId必须是整数,date必须是字符串) - 查看Response的详细错误信息,400错误通常会明确提示具体原因(如"缺少防伪令牌"、"模型绑定失败")
内容的提问来源于stack exchange,提问作者info
相关产品推荐
相关产品推荐

