Я исследовал несколько вещей: что происходит, когда вы передаете строку из AJAX вместо целого числа и как различные маршруты влияют на вызов (см. Интересную заметку ниже, если у вас есть время) Но в основном все, что я нашел в том, что Razor Pages довольно просты, и все, кажется, просто работает. Как я уже говорил, даже передавая строку, в которой целочисленный тип id
все еще попадает в метод-обработчик (он просто дал мне default(int)
)
, я создал этот репозиторий только для исследования: https://github.com/EntityAdam/RazorPageHandlers
Основным блокировщиком, как указал @Yan, является токен Anti-Forgery. Это действительно единственное, что заставило обработчик не достичь точки останова. Как было предложено, проверьте вкладку сети на наличие неудачных запросов или консоль для кода bum JavaScript.
Из своего фрагмента, чтобы изменить его на OnPostDelete
, вам нужно будет использовать тип POST
в AJAX вызов И включает токен против подделки.
$.ajax({
type: 'POST',
headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() },
url: '?handler=Delete',
data: {
id: $(this).data('id')
}
})
.fail(function (e) {
// Error
alert(e.responseText); // Way too much info
})
.done(function () {
// Success
})
.always(function () {
// Always
});
Еще один топи c, который я не видел обсуждаемым, - откуда этот токен? Он генерируется Razor автоматически, когда есть элемент <form>
. Если у вас нет элемента <form>
, вы можете генерировать токены, когда они вам нужны, ознакомьтесь с блоком @functions {}
в этой статье MSDN . Есть также сценарий ios, где CSRF бесполезен или не требуется, и вы также можете отключить защиту от подделки, если она вам не нужна (это совершенно другое обсуждение).
Моя критика подхода мнения, так что принимайте их или оставляйте.
- Не используйте jQuery, если вы можете избежать этого, исходя из предпосылки, что улучшения JavaScript возможно устарели jQuery. Используйте простой ванильный код JS.
- Ajax также показывает его возраст. Если вам нужна только поддержка современных браузеров, рассмотрите Fetch API
- Не пишите JS вообще! Blazor новый и блестящий. Все еще есть некоторые проблемы с ростом, но я бы предпочел, чтобы моя боль была в C#, чем в JavaScript =)
Интересная вещь, с которой я столкнулся ..
Для В этой демонстрации я использовал следующую директиву @page
@page "{id?}"
В части HTML таких форм, как:
<form method="post" asp-page-handler="Delete">
<input type="hidden" name="id" value="1" />
<button class="btn btn-danger">Delete</button>
</form>
Я использую помощник по тегам asp-page-handler
чтобы помочь в создании правильного URL. Для обработчика Create с этой директивой @page
помощник по тегам получает цель формы /?handler=Create
Если вы замените эту директиву @page на @page "{handler?}/{id:int?}"
, помощник по тегам определит маршрут который сейчас /Delete
. Но угадайте что? Вызовы AJAX работают с любой директивой @page
, хотя URL-адрес в AJAX жестко задан в ?handler=Delete'