AJAX 调用适用于 GET 但不适用于 POST

AJAX call works with GET but not with POST

以下 AJAX 调用对我有效。

CSHTML

$.ajax({
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    },
});

CS

public void OnGetDelete(int id)
{
}

但是如果我按如下方式更改它,则会出现 400 错误。

CSHTML

$.ajax({
    type: 'POST',
    url: '?handler=Delete',
    data: {
        id: $(this).data('id')
    },
});

CS

public void OnPostDelete(int id)
{
}

Post 在这里对我来说更有意义。我如何将其设为 post?

Razor 页面旨在自动防止跨站点请求伪造 (CSRF/XSRF) 攻击。

请求失败,因为页面上没有 AntiForgeryToken。

解决方案:

1)尝试添加:

@Html.AntiForgeryToken()

在您的 .cshtml 页面顶部。当您执行此操作时,razor 页面将添加一个名为 __RequestVerificationToken 的隐藏输入,其中包括您的请求令牌。

2) 更改您的 ajax 请求并添加此内容。

beforeSend: function (xhr) {
    xhr.setRequestHeader("XSRF-TOKEN",
        $('input:hidden[name="__RequestVerificationToken"]').val());
},

3) 在您的 ConfigureServices 方法中配置防伪造

public void ConfigureServices(IServiceCollection services)
{
    services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
}

之后,您将不会再收到 400 错误。

参考:https://www.talkingdotnet.com/handle-ajax-requests-in-asp-net-core-razor-pages/