#asp.net-core #razor #asp.net-core-mvc
#asp.net-ядро #razor #asp.net-ядро-mvc #asp.net-core
Вопрос:
Кажется, я не могу заставить это работать с последней версией .NET Core 2.2 Razor. Я жестко закодировал URL-адрес, просто чтобы убедиться, что он правильный. Скрипт ajax находится внутри частичного представления, но я протестировал перемещение скрипта на главную страницу с тем же результатом 404.
$.ajax({
type: 'POST',
url: 'https://localhost:44349/Admin/Catalog/Products/Edit?handler=Filteramp;id=1',
success: function (data) {
alert("success");
},
error: function (xhr, textStatus, error) {
alert(xhr.statusText);
}
});
И вот мой обработчик:
public IActionResult OnPostFilter(int id)
{
return new JsonResult("test");
}
Я отключил токен защиты от подделки при запуске, просто чтобы убедиться, что это не было причиной моей проблемы:
services.AddMvc().AddRazorPagesOptions(o =>
{
o.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
});
Комментарии:
1. Что
Admin/Catalog/Products/Edit
означает? Поделитесь с нами своей полной страницей razor и структурой проекта.2. Это страница по адресу: Области > Администратор > Страницы > Каталог > Продукты > Edit.cshtml … Я могу перейти на страницу / Admin / Catalog /Products /Edit / 8, и это работает, но когда я пытаюсь опубликовать AJAX с помощью обработчика, я не могу заставить его работать. У меня есть еще один проект, который является более ранней версией .NET Core Razor, и он работает. Я считаю, что в 2.2 что-то изменилось, что вызывает мою проблему.
Ответ №1:
404
означает, что URL неверен.
Страницы Razor должны устанавливать RequestVerificationToken
заголовок при отправке POST
запроса:
Добавьте @Html.AntiForgeryToken()
в свой вид, затем измените свой ajax следующим образом:
$.ajax({
type: 'POST',
url: 'https://localhost:44349/Admin/Catalog/Products/Edit?handler=Filter',
contentType: 'application/x-www-form-urlencoded',
dataType:'json',
data: {
id: 1
},
headers:
{
"RequestVerificationToken": $('input:hidden[name="__RequestVerificationToken"]').val()
},
success: function (data) {
alert("success");
},
error: function (xhr, textStatus, error) {
alert(xhr.statusText);
}
});
Комментарии:
1. Спасибо. В опубликованном мной коде не было AntiForgeryToken, потому что я отключил его при запуске. Я попытался добавить токен в заголовок, и я все еще получаю ошибку 400. Также было рекомендовано изменить имя заголовка на «XSRF-TOKEN», но это тоже не работает.
2. вы также можете отключить ее с помощью [ValidateAntiForgeryToken(Order = 1000)] learnrazorpages.com/security/request-verification