Сложное связывание модели с помощью Ajax и Razor Pages - PullRequest
0 голосов
/ 05 февраля 2019

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

У меня есть рабочий пример, где я непосредственно передаю коллекцию объектов, однако мне нужно указать [FromBody].

Если я прохожу через сложный объект с коллекцией, тогда коллекциявозвращается как ноль, я добавил пару свойств к MyObj, и все связывается, кроме коллекции людей.

Кажется, что действует очень странно.

MVC

public async Task<IActionResult> OnPostAsync([FromBody] List<Person> 
people){}

JAVASCRIPT

                    $.ajax({
                    url: '@Url.Page("People")',
                    data: JSON.stringify(people),
                    dataType: "json",
                    contentType: 'application/json; charset=utf-8',
                    type: "post",
                    beforeSend: function(xhr) {
                        xhr.setRequestHeader("XSRF-TOKEN",
                            $('input:hidden[name="__RequestVerificationToken"]').val());
                    }
                });

Не работает

MVC

public async Task<IActionResult> OnPostAsync(MyObj contract){}

JAVASCRIPT

  var complexObject = {
     People: people,
   };

var obj = { contract: complexObject };
var data2send = JSON.stringify(obj);


                    $.ajax({
                    url: '@Url.Page("People")',
                    data: data2send,
                    dataType: "json",
                    contentType: 'application/json; charset=utf-8',
                    type: "post",
                    beforeSend: function(xhr) {
                        xhr.setRequestHeader("XSRF-TOKEN",
                            $('input:hidden[name="__RequestVerificationToken"]').val());
                    }
                });


example of what's data2send contains : "{"contract":{"People":[{"name": "bob"}}"

C #

public class MyObj 
{
   public List<Person> People {get; set;}
}

1 Ответ

0 голосов
/ 05 февраля 2019

Во втором примере вы, кажется, заключили JSON в два объекта, а не в один.

Я предполагаю, что под

{"contract":{"People":[{"name": "bob"}}

вы действительно имели в виду

{"contract":{"People":[{"name": "bob"}]}}

, потому что первая версия является неполной / недействительной.

В любом случае, это состоит из (неназванного) объекта, содержащего другой объект, называемый «контракт», который затем содержит другое свойство, называемое «Люди».Однако ваш класс C # MyObj не содержит абстракции contract, это просто имя, которое вы дали параметру в методе действия.Я почти уверен, что вы на самом деле не отправляете это в JSON, потому что механизм связывания пытается получить отправленный вами JSON и превратить его в экземпляр MyObj, и очевидно, что эта структура не соответствует вашему JSON.

Я ожидаю, что отправка подобного объекта будет более успешной:

{ "People":[{"name": "bob"}]}

Чтобы получить это, JavaScript должен быть

var complexObject = {
     People: people,
   };

//...

$.ajax({
  url: '@Url.Page("People")',
  data: complexObject,
  //...etc

Я недумаю, что вам нужна другая обертка вокруг него.

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