AJAX вызов работает с GET, но не с POST - PullRequest
0 голосов
/ 19 марта 2020

У меня работает следующий AJAX звонок.

CS HTML

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

CS

public void OnGetDelete(int id)
{
}

Но если я изменю его следующим образом, я получу ошибку 400.

CS HTML

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

CS

public void OnPostDelete(int id)
{
}

enter image description here

Пост имеет больше смысла для меня здесь. Как бы я сделал это сообщение?

1 Ответ

1 голос
/ 19 марта 2020

Страницы Razor предназначены для автоматической защиты от атак подделки межсайтовых запросов (CSRF / XSRF).

Запрос не выполняется, поскольку на странице отсутствует AntiForgeryToken.

Решение:

1) Попробуйте добавить:

@Html.AntiForgeryToken()

в верхней части страницы .cs html. Когда вы сделаете это, бритвенные страницы добавят скрытый ввод с именем __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/

...