ASP.NET Razor Pages, передача данных из внешнего скрипта во внутренний

Я работаю над проектом, в котором использую карту, и мне нужно отправить отзыв на серверную часть с текущим уровнем масштабирования. Проблема в том, что страница возвращает только ошибку 400 Bad Request вместе с «Ошибка: SyntaxError: Неожиданный конец ввода JSON».

.cshtml:

map.on('zoomend', function () {
    var zoomLevel = map.getZoom();

    // Enviar el nivel de zoom al backend
    fetch('@Url.Page("/Map", "UpdateZoom")', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(zoomLevel)
    })
        .then(response => response.json())
        .then(data => console.info(data))
        .catch(error => console.error('Error:', error));
});

.cs:

public IActionResult OnPostUpdateZoom([FromBody] string zoom)
{
    ZoomLevel = JsonSerializer.Deserialize<int>(zoom);

    int valorCapturado = ZoomLevel;


    return new JsonResult(new { success = true, receivedValue = valorCapturado });
}

После проверки точек останова я понял, что метод OnPostUpdateZoom в серверной части никогда не запускается. Я также проверил, что @Url.Page("/Map", "UpdateZoom") генерирует правильный URL-адрес.

UpdateZoom — имя обработчика. Вам нужно использовать синтаксис handler=. Для этого есть помощники.

Jonathan Wood 22.07.2024 01:34
[FromBody] уже должен десериализовать json. Но ваша переменная zoom — это строка. В любом случае вы можете захотеть поместить этот уровень масштабирования в объект json для документации и будущего расширения. Но я не понимаю, почему вы пытаетесь изменить состояние сервера.
Jeremy Lakeman 22.07.2024 03:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Map.getZoom() возвращает число. Я пишу пример реализации сценария внешнего интерфейса на внутреннем сервере. Надеюсь, это вам поможет.

1 MyModel.cs

    public class MyModel{public int Key { get; set; }}

2 .cs

    public IActionResult OnPostUpdateZoom([FromBody] MyModel model)
        {
             return new JsonResult(
              new { success = true, receivedValue = model.Key });
        }

3.cshtml

    $(document).ready(function () {
       var zoomLevel = 12;
       var obj = { Key: zoomLevel }
    // Enviar el nivel de zoom al backend
      fetch("?handler=UpdateZoom", {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(obj)
     })
                
        .then(data => console.info(data))
        .catch(error => console.error('Error:', error));
    })

Результат:

Я уже пробовал, но он все равно возвращает неверный запрос вместе с этим объектом: {type: 'basic', url: 'localhost:7078/Map?handler=UpdateZoom', перенаправлено: false, статус: 400, ок: ложь, …}

Brian Acosta 22.07.2024 17:05

builder.Services.AddRazorPages(o =>{ o.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute()); }); Удалите эту конфигурацию, в моем проекте ошибка 404. Вы можете попробовать, если вам интересно.

XieMan 23.07.2024 03:49
Ответ принят как подходящий

Вы не включили AntiForgeryToken в запрос Fetch, поэтому получаете код состояния 400 Bad Request. Поскольку вы публикуете данные JSON, вам следует отправить это значение в заголовке запроса. Кроме того, вам необходимо сгенерировать значение для публикации.

Добавьте @Html.AntiForgeryToken() в любом месте страницы Razor, чтобы сгенерировать скрытое поле с именем __RequestVerificationToken, а затем добавьте его значение в заголовок запроса:

fetch('@Url.Page("/Map", "UpdateZoom")', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'RequestVerificationToken' : document.querySelector('[name = "__RequestVerificationToken"]').value
        },
        body: JSON.stringify(zoomLevel)
    })
        .then(response => response.json())
        .then(data => console.info(data))
        .catch(error => console.error('Error:', error));

https://www.learnrazorpages.com/security/request-verification#ajax-post-requests-and-json

Это решило проблему, большое спасибо!

Brian Acosta 22.07.2024 18:49

Другие вопросы по теме