【问题标题】:ASP.NET Core Razor - AJAX Post - 400 Bad RequestASP.NET Core Razor - AJAX 发布 - 400 错误请求
【发布时间】:2025-12-09 05:55:02
【问题描述】:

ASP.NET Core Razor 页面中的 AJAX POST 将不起作用。它总是返回 400 Bad Request。

我有以下页面方法代码:

[ValidateAntiForgeryToken]
public async Task<IActionResult> OnPostProcessCCPaymentAsync(CheckInPaymentModel checkInPaymentModel)
    {
        return new JsonResult(checkInPaymentModel.AmountExtra);
    }

页面设置如下:

@Html.AntiForgeryToken()

还有下面的 JS AJAX 调用:

$.ajax({
    type: "POST",
    url: "/CheckIn/Payment?handler=ProcessCCPayment",
    contentType: "application/json",
    beforeSend: function (xhr) {
        xhr.setRequestHeader("XSRF-TOKEN",
            $('input:hidden[name="__RequestVerificationToken"]').val());
    },
    data: JSON.stringify({
        // Those property names must match the property names of your PromotionDecision  view model
        Donate: true
    }), 
    success: function (response) {
        $(".paymentDetails .loading").addClass("loader").removeClass("loading");
    },
    failure: function (response) {
        $(".paymentDetails .loading").addClass("loader").removeClass("loading");
    }
});

如果 Ajax 类型更改为 GET 并且方法更改为 OnGetProcessCCPaymentAsync,则它会正确发送到服务器。

但是,Core Razor 中的 AJAX POST 总是失败并返回 400 Bad Request。

我是直接从 Visual Studio 调试,所以 URL 是 http://localhost:62632/CheckIn/Payment,所以我不知道如何定位日志以查看调试实例接收请求时发生了什么错误。

任何想法或建议将不胜感激。

【问题讨论】:

  • 在进行 POST 时,您是否尝试过使用 [HttpPost] 装饰 MVC 操作?
  • 您的请求标头有错误的名称,它应该是 RequestVerificationToken 并且还要注意 AntiForgeryToken 不用于 GET。在您的问题中添加 razor-pages 标签是个好主意。
  • @MarkG 成功了。标头应该是“RequestVerificationToken”而不是“XSRF-TOKEN”learnrazorpages.com/security/request-verification
  • 我认为如果您可以将问题恢复为原始文本并将编辑添加为答案会更好。有同样的问题,这篇文章帮助我解决了它! +1
  • 请将解决方案作为答案发布,而不是更新问题。还有@MarkG,请随时发表您的评论作为答案。

标签: ajax razor asp.net-core


【解决方案1】:

为了避免在阅读上面的修订和评论时感到困惑(这让我摸不着头脑),解决方案是改变:

xhr.setRequestHeader("XSRF-TOKEN",

收件人:

xhr.setRequestHeader("RequestVerificationToken",

答案在修订版中,有人将其编辑掉。 cmets中也简要提到了它。我当然没有任何功劳,只是想尽量减少其他人在未来遇到这种精神错乱的错误时的困惑。

【讨论】: