.NET CORE Razor Pages Ajax-вызов метода C #

В настоящее время я делаю сайт для отображения местоположений на карте Google. Я получаю адреса из базы данных Airtable.com, и все там работает нормально. Однако, поскольку Google разрешает только определенное количество запросов на геокодирование адресов, я хочу сохранить координаты в той же базе данных, поэтому я использую api геокода только тогда, когда нужно найти новое местоположение (адрес). У меня есть все настройки, но я не могу понять, как я вызываю метод cs из js на страницах razor. Я использовал WebMethod в прошлом, но, по-видимому, я не могу использовать его здесь.

Когда я пытаюсь использовать примеры, которые нахожу в Интернете, он говорит, что мне нужен RequestVerificationToken, но для этого требуется, чтобы вызов происходил из формы (я прав?), И мой вызов ajax запрашивается, когда сайт загружается, и он получает местоположение из базы данных, в которой еще нет координат.

Я впервые использую Razor Pages, так что потерпите меня, если я что-то неправильно понял.

Изображение моего метода cs, который я хотел бы вызвать (Index.cshtml.cs) https://i.stack.imgur.com/nnqdQ.png

    [HttpPost] // RequestVerificationToken
    public void OnPostGeoLocation()
    {
        // Just to test that it actually gets called
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
        Console.WriteLine("OnPostGeoLocation CALLED ####################################");
    }

Изображение вызова Ajax из JavaScript, который обычно вызывается при загрузке страницы: AjaxCall

function updateRow(recordID, latLng) {
   console.log("REC_ID: " + recordID);
   console.log("LatLng: " + latLng);
   $.ajax({
       type: "POST",
       url: '/Index?OnPostGeoLocation', 
       contentType: "application/json; charset=utf-8",
       dataType: "json"
   }).done(function (data) {
       console.log(data.result);
   })
 }

Я знаю, что часть кода - это не совсем то, что мне нужно, но я просто скопировал из Интернета и отредактирую, когда я опередил это препятствие.


person Nikolaj Herting Olsen    schedule 29.05.2018    source источник
comment
Покажите больше PageModel в минимальном воспроизводимом примере. Я бы также предложил ссылку Введение в Razor Pages в ASP.NET Core   -  person Nkosi    schedule 29.05.2018
comment
Насколько я могу судить, у вас проблемы с XSRF / CSRF в зависимости от конфигурации Я думаю, вам нужно добавить заголовок в свой вызов ajax   -  person Filip Cordas    schedule 29.05.2018


Ответы (2)


Попробуйте вернуть правильный результат IActionResult.

[HttpPost]
public IActionResult OnPostGeoLocation() {
    // Just to test that it actually gets called
    Console.WriteLine("OnPostGeoLocation CALLED ####################################");

    return new JsonResult("OnPostGeoLocation CALLED ####################################");
}

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

Обновленный вызов Ajax

function updateRow(recordID, latLng) {
    console.log("REC_ID: " + recordID);
    console.log("LatLng: " + latLng);
    $.ajax({
        type: "POST",
        url: '/Index?handler=GeoLocation', 
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
        },
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    }).done(function (data) {
        console.log(data.result);
    })
}

Очень полезная статья для справки

Обработка запросов Ajax на страницах Razor ASP.NET Core

person Nkosi    schedule 29.05.2018
comment
Ах да, это просто опечатка. Он показывает OnPostGeoLocation на картинке. Когда я изменяю? на косую черту (/) я получаю ошибку 404 not found вместо ошибки no VerficationToken. Я изучу ссылки, которые вы оба предоставили, и вернусь, если я все еще не могу понять это. Спасибо! - person Nikolaj Herting Olsen; 29.05.2018

После прочтения Обработка запросов Ajax в ASP.NET Core Razor Pages более тщательно я понял, что действительно неправильно понял некоторые принципы и что вы МОЖЕТЕ добавить AntiForgeryToken явно без тега «form», используя @ Html.AntiForgeryToken ()

Теперь мой код выглядит так:  введите описание изображения здесь

А также:

введите здесь описание изображения

person Nikolaj Herting Olsen    schedule 29.05.2018
comment
Только одна вещь, которую вам не нужно использовать перед отправкой, у вас есть объект headers в вызове. Кроме того, это можно настроить глобально, поэтому вам не нужно это для каждого ajax. - person Filip Cordas; 29.05.2018
comment
Вы правы, и я тоже ошибся в своем ответе с обработчиком. фиксация. - person Nkosi; 29.05.2018