Не могу опубликовать модель через ajax - PullRequest
0 голосов
/ 24 августа 2018

Я использую Ajax , чтобы сделать модель и отправить ее на контроллер.

Вот модель:

 public class PersonDto{
        public Guid Id { get; set; }
        public int PersonAge { get; set; }
        public string PersonName { get; set; }
        public DateTime? DateCreated { get; set; }
    }

Вот контроллер:

[Route("EditPerson")]
[HttpPost]
public async Task<IActionResult> EditPerson(PersonDto offer) {
  //Save to Entity FW
}

Вот Ajax:

var data = {
    Id: $('#personModal #personModalTitle').text(),
    PersonAge: $('#personModal #personId').val(),
    PersonName: $('#personModal #personName').val()
};

var dataJson = JSON.stringify(data);
console.log(dataJson);

$.ajax({
    type: 'POST',
    url: 'Persons/EditPerson',
    data: dataJson,
    contentType: "application/json",
    success: function (result) {

    },
    error: function (error) {
        Alert("Error Saving offer changes!");
    }
});

Вот консольный журнал (Json), все выглядит великолепно:

{"Id":"96f2ae80-45cc-4a6c-abe0-230c2cbd3043","PersonAge":"5","PersonName":"John"}

Когда я Отладка PersonsController Я вижу, что моя модель никогда не заполняется, не пуста, просто в ней нет данных.

Я попытался добавить DateCreated к модели в Ajax функции, я попытался разобрать Age в int.

Я попытался добавить [FromBody] аннотацию к PersonDto в Action , затем я получил NULL к моей модели.

Я незнать, где я могу сделать ошибку здесь.

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Можете ли вы попытаться получить ваши данные как JObject :

[FromBody] JObject предложение

[Route("EditPerson")]
[HttpPost]
public async Task<IActionResult> EditPerson([FromBody] JObject offer) {
    string Id = (string)form.SelectToken("Id")
    string PersonAge= (string)form.SelectToken("PersonAge")
    string PersonName= (string)form.SelectToken("PersonName")
}
0 голосов
/ 24 августа 2018

Как я вижу из вашего кода, вы не посылаете переменную, которую вы ожидаете, "предложение".При вызове AJAX и отправке данных параметры данных должны называться такими, как вы ожидаете.

Вы должны отправлять данные в следующем формате:

{ 
  offer: { PersonAge: 10, PersonName: 'Senad' } 
}

Ваш вызов должен выглядеть следующим образом

var data = {
    Id: $('#personModal #personModalTitle').text(),
    PersonAge: $('#personModal #personId').val(),
    PersonName: $('#personModal #personName').val()
};

$.ajax({
    type: 'POST',
    url: 'Persons/EditPerson',
    data: { offer: data }, //no need to serialize it
    dataType: 'json',
    success: function (result) {

    },
    error: function (error) {
        Alert("Error Saving offer changes!");
    }
});

Надеюсь, это полезно.

0 голосов
/ 24 августа 2018

Для тела в кодировке JSON просто добавьте [FromBody]:

    [Route("EditPerson")]
    [HttpPost]
    public async Task<IActionResult> EditPerson([FromBody] PersonDto offer)
    {
        return new JsonResult(offer);
    }

Обновление:

  1. Другой способ сделать это - использовать [ApiController] для украшения класса контроллера.

  2. Если нет [ApiController], вы должны добавить [FromBody], чтобы принудительно связать Model Binder для чтения из тела.

  3. Является ли полезная нагрузка на верблюжьих или паскалях или не имеет значения. Это не имеет значения.

Чехол для верблюда:

POST https://localhost:44372/api/values/EditPerson HTTP/1.1 
Content-Type : application/json

{"id":"96f2ae80-45cc-4a6c-abe0-230c2cbd3043","personAge":"5","personName":"John"}

Pascal Case:

POST https://localhost:44372/api/values/EditPerson HTTP/1.1 
Content-Type : application/json

{"Id":"96f2ae80-45cc-4a6c-abe0-230c2cbd3043","PersonAge":"5","PersonName":"John"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...