Использование обработчиков страниц OnPost для запросов AJAX на страницах Razor

#javascript #jquery #ajax #asp.net-core #razor-pages

#javascript #jquery #ajax #asp.net-core #razor-страницы

Вопрос:

У меня есть функция JavaScript / jQuery, используемая для выполнения запросов AJAX как часть ASP.NET Проект Core Razor Pages (Visual C #). Запрос AJAX вызывает метод обработчика «OnGet» в PageModel (.cshtml.cs) любой страницы, на которой он вызывается. AJAX-запрос JS / jQuery:

 function conditionalDropDown(parameters) {

//code to get handler method inputs in correct format

var pathname = window.location.pathname;
var handler = "?handler=ConditionalDropDown";
var actionpath = pathname   handler;

$.ajax({
    dataType: 'json',
    url: actionpath,
    type: 'GET',
    data: {
        parameterName: parameterValue
    },
    beforeSend: function (xhr) {
        xhr.setRequestHeader("XSRF-TOKEN",
            $('input:hidden[name="__RequestVerificationToken"]').val());
    },
    success: function (data) {
        //dealing with the data returned by the request
    },
    error: function () {
        alert("AJAX Request Failed, Contact Support");
    }
});
}
  

Метод обработчика в PageModel:

 public JsonResult OnGetConditionalDropDown(parameters)
    {
        //call a function to get the return string

        return new JsonResult(dropdownHTML);
    }
  

Я хочу изменить свой AJAX-запрос таким образом, чтобы вместо него использовался метод обработчика «OnPost». Я пытался изменить type: 'GET' на type: 'POST' в функции запроса AJAX и имя метода обработчика с OnGetConditionalDropDown на OnPostConditionalDropDown , но запрос всегда завершается неудачей.

Я @Html.AntiForgeryToken() добавил на страницу (.cshtml), с которой отправляется запрос AJAX, но я не уверен, что это в нужном месте. В настоящее время он находится внутри <form> тегов формы, из которой вызываются AJAX-запросы.

Я думаю, что мне чего-то не хватает в настройке запроса, но я понятия не имею, что это. Любая помощь приветствуется.

Ответ №1:

Отвечая на мой собственный вопрос…

  1. Запрос AJAX — удалена beforeSend функция в запросе, заменена на: headers: { "RequestVerificationToken": $('input[name="__RequestVerificationToken"]').val() }, при инициализации запроса.
  2. Запрос AJAX — изменен type: 'GET' на type: 'POST'
  3. Метод обработчика — OnGet —> OnPost
  4. Page .cshtml — удален @Html.AntiForgeryToken() , добавлен method="post" в форму, из которой выполняется запрос AJAX

Теперь работает отлично!