JQuery JSON POST-запрос к контроллеру ASP.NET MVC не достигает конечной точки, но ручное использование маршрута работает правильно - PullRequest
0 голосов
/ 07 марта 2019

У меня есть приложение ASP.NET, которое состоит из внешнего интерфейса, содержащего форму, данные которой я хочу передать в свой внутренний интерфейс C #.Для этого я использую почтовый запрос JQuery для сериализации данных формы и отправки их на контроллер с помощью JSON.Ниже приведен мой код Javascript, который вызывает маршрут контроллера:

$(".data-submit").on("click",
        function(event) {
            var formArray = $("#amend-form").serializeArray();
            var json = JSON.stringify(formArray);

            $.post(windowLocationOrigin() +
                "/Instruction/AmendData", 
                json, 
                function (data) {
                    alert("api endpoint called");
                });

        });

А вот конечная точка контроллера называется

        [Route("[controller]/AmendData")]
        public IActionResult AmendPortingData([FromBody] string json)
        {
            return Ok(json);
        }

Когда я отправляю эту форму через мой интерфейс,вызывается событие onClick JS и отправляется запрос post, однако конечная точка контроллера никогда не достигается.У меня есть точка останова в строке return Ok(json), которая никогда не срабатывает после отправки формы.

Если я проверяю инструменты разработчика, я получаю ошибку 500 с сообщением: POST https://localhost:44358/Instruction/AmendData 500

Однако, если я затем отправлю запрос на этот URL https://localhost:44358/Instruction/AmendData?json=123, конечная точка попадет правильно, и я увижу значение 123 в моем отладчике.

Однако я хочу, чтобы мои данные можно было отправлять через тело почтового запроса, а не через URL-адрес, поскольку отправляемая форма велика и содержит слишком много данных для отправки через GET.

Я попытался добавить атрибут [HttpPost] к конечной точке контроллера, но это приводит к точно такому же поведению, за исключением того, что он не позволяет работать с URL-адресом GET.

1 Ответ

3 голосов
/ 07 марта 2019

Действие вашего контроллера:

public IActionResult AmendPortingData(string json)

ожидает параметр с именем json.

Когда вы вызываете это с помощью:

 $.ajax({ url: url, data: "string" });

передаваемые данные не имеют имени параметра, поэтому связыватель моделей по умолчанию не может определить, какую часть данных применить к этому параметру.

Это работает с:

http://url?json=string

, так как вы указываете имя параметра ?json=, если вы вызвали свое действие с помощью

http://url/string

, то оно снова не распознало бы"string", как для параметра "json" и не работает (хотя, вероятно, даст вам более полезную ошибку "не могу найти данные для параметра") (конечно, при условии отсутствия дополнительной маршрутизации).

Предоставляястроковый параметр имя, связыватель модели по умолчанию сможет сопоставить строку с именем параметра:

$.ajax({ url: url, data: { json: "string" }});

Альтернативой является добавление связывателя модели, который будет принимать любую строку POST ипередайте его одному параметру - но вышеупомянутое, как правило, чище и проще в обслуживании.


Добавление [HttpPost] ограничивает действие только этим глаголом (поэтому, кроме этого, добавление [HttpPost][HttpGet] делаетэто непригодно какэто должно быть POST и GET).


Если вы строите свою форму из модели представления, то вы можете использовать эту модель непосредственно в действии:

public ActionResult MyAction(MyViewModel viewmodel)

и передайте напрямую:

$.ajax({ url: url, data: $("form").serialize() });

, и связыватель моделей по умолчанию сопоставит имена ваших входных данных со свойствами в модели представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...