Измените цель сообщения ajax на странице бритвы с API в контроллере на обработчик сообщений "code-behind" на той же странице бритвы. - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть следующая запись ajax на моей странице index.cs html, которая отлично работает:

create: {
            url: "/api/LearningTasks/create",
            type: "POST",
            dataType: "json"
        },

Она отправляет сообщение моему контроллеру, и прием кода работает нормально. Это выглядит так:

[HttpPost]
    [Route("api/LearningTasks/create")]
    public async Task<ActionResult<LearningTask>> CreateLearningTask(LearningTask learningTask)
    {
        _context.LearningTasks.Add(learningTask);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetLearningTask", new { id = learningTask.Id }, learningTask);
    }

Я бы хотел изменить цель своего поста, чтобы она перешла к «code-behind» index.cs html .cs. Метод, который я хотел бы получить, выглядит следующим образом:

 public async Task<IActionResult> OnPostAsync()
    {
        // This is where I want to have the send the data for the create operation instead of to /api/LearningTasks/create
        _context.LearningTasks.Add(LearningTask);
        await _context.SaveChangesAsync();

        return null;  
    }

Я попытался удалить строку url: "/api/LearningTasks/create", и установить ее на url: "",, но ни одна из них не работает. Буду признателен за любую помощь в выяснении, как это сделать.

1 Ответ

0 голосов
/ 20 февраля 2020

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

Вы должны отправить токен защиты от подделки в заголовке запроса на сервер, используя AJAX:

  1. Добавить явно, используя @Html.AntiForgeryToken(), добавит скрытый тип ввода с именем __RequestVerificationToken.

  2. Отправка токена в заголовке запроса:

    $.ajax({
        url: '/Index',
        type: 'POST',
        beforeSend: function (xhr) {
            xhr.setRequestHeader("XSRF-TOKEN",
                $('input:hidden[name="__RequestVerificationToken"]').val());
        },   
    })
    .done(function (result) { })
    
  3. Настройка службы защиты от подделки для поиска заголовка X-CSRF-TOKEN:

    services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
    

Ниже приведена статья для справки :

Дескриптор Ajax Запросы в ASP. NET Core Razor Pages

...