Не удается отправить модель через ajax

Я использую 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 to int.

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

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

c#,asp.net-core,

0

Ответов: 3


1 принят

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

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

Обновить :

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

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

  3. Независимо от того, нужна ли полезная нагрузка camelCased или pascalCased или нет. Это не имеет значения .

Случай верблюда:

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

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

Паскаль Кейс:

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

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

0

Можете ли вы попытаться получить данные как 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

Как я вижу из вашего кода, вы не отправляете переменную, которую вы ожидаете, «предлагаете». При выполнении вызова и отправки данных 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!");
    }
});

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

C #, asp.net-жильный,
Похожие вопросы