You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:27:00