.Net 5 MVC控制器接收jQuery Ajax POST请求返回400错误如何解决
问题原因和解决方案
核心触发400错误的原因
你的Edit Action标注了[ValidateAntiForgeryToken]校验规则:普通表单提交时,浏览器会自动携带页面生成的__RequestVerificationToken隐藏域值,校验通过即可进入Action;但AJAX提交JSON请求时,你没有在请求中携带防伪令牌,ASP.NET Core会直接拦截请求返回400错误,不会进入Action执行。
其他可能导致400的原因
- 模型绑定失败:你前端构造的
postBackModel结构、字段类型和后端PostbackModel定义不匹配,比如数值类型传了非数值字符串、必填字段为空,都会触发模型验证失败返回400。
修复步骤
1. 给AJAX请求添加防伪令牌头
修改你的AJAX代码,在参数中添加headers配置,读取页面表单中自动生成的防伪令牌:
let postBackModel: AjaxPostbackModel = < AjaxPostbackModel > {}; postBackModel.NewAnswers = newAnswers postBackModel.OldAnswers = oldAnswers; postBackModel.UpdatedAnswers = updatedAnswers; let thisUrl: string = $('form').prop('action'); $.ajax({ type: "POST", url: thisUrl, data: JSON.stringify(postBackModel), contentType: 'application/json; charset=utf-8', // 新增防伪令牌头 headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() } }).done(function(result) { $('.spinnerContainer').hide(); console.log('postback result', result.message); console.log('inserted entities', result.insetedEntities); dialogOptions.title = 'Success'; $('#dialog') .text('Data is saved. ' + result.message) .dialog(dialogOptions); }).fail(function(error) { console.log('postback error', error); $('.spinnerContainer').hide(); dialogOptions.title = error.statusText; dialogOptions.classes = { 'ui-dialog': 'my-dialog', 'ui-dialog-titlebar': 'my-dialog-header' } $('#dialog') .text('Data is not saved') .dialog(dialogOptions) });
2. 调整Action返回值适配AJAX请求
你当前Action返回RedirectToAction会触发AJAX自动跟随重定向,无法返回前端需要的JSON数据,建议修改返回值类型:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult Edit([FromBody] PostbackModel model) { if (ModelState.IsValid) { List < UserAnswer > newAnswers = model.NewAnswers; List < UserAnswer > oldAnswers = model.OldAnswers; List < UserAnswer > updatedAnswers = model.UpdatedAnswers; UserAnswer thisAnswer = new(); if (newAnswers != null) thisAnswer = newAnswers.Find(x => x.StageName != string.Empty); else if (oldAnswers != null) thisAnswer = oldAnswers.Find(x => x.StageName != string.Empty); else if (updatedAnswers != null) thisAnswer = updatedAnswers.Find(x => x.StageName != string.Empty); //ToDo: call webapi Question controller to persist the data to database // 替换原有RedirectToAction,返回JSON+跳转地址 return Json(new { message = "保存成功", insertedEntities = 你的业务返回数据, redirectUrl = Url.Action(nameof(Edit), new { stage = thisAnswer.StageName, personName = thisAnswer.personName, custID = thisAnswer.custID.ToString(), redirectFrom = "Edit" }) }); } else { return Json(new { message = "数据验证失败", redirectUrl = Url.Action("Index", "Home") }); } }
3. 排查模型绑定问题(添加令牌后仍400时操作)
可以临时注释掉[ValidateAntiForgeryToken]注解测试,同时在Action开头断点查看ModelState.IsValid的值,遍历ModelState.Values中的错误信息,确认是否是字段类型/结构不匹配导致的绑定失败。
内容的提问来源于stack exchange,提问作者user266909
相关产品推荐
相关产品推荐

