Пользовательский механизм связывания модели ASP.Net Core JSON

Мой опубликованный объект JSON:

{{
 "emails": [
        {
          "To": "info@gmail.com",
          "Subject": "Subject",
          "Body": "Body",
          "ID": "d3d13242-6eff-4c57-b718-ef5ad49fe301"
        },
        {
          "To": "hr@gmail.com",
          "Subject": "Subject",
          "Body": "Body",
          "ID": "101edaf0-fcb4-48fc-9e9e-0d7492b591b0"
        }
      ]
}}

По умолчанию механизм связывания модели ASP.NET не связывает этот объект JSON, и, как вы можете видеть здесь, я всегда получаю нулевое значение, когда отправляю пост-запрос в API:

[HttpPost, Route("Send")]
public async Task<IActionResult> Send(Email[] emails)
{
  var toSave = from email in emails
                         select new EmailQueueItem
                         {
                             Html = true,
                             To = email.To,
                             Subject = email.Subject,
                             Body = email.Body
                         };

   await Database.BulkInsert(toSave.ToArray());

   return Ok();
 }

свойствоemails всегда равно null. Я был бы признателен за любую помощь в создании пользовательских связывателей моделей, которые обрабатывают JSON-объекты такого типа.

1 ответ

Решение

Проблема в том, что вы на самом деле отправляете объект, содержащий одно свойство с именем email, а не массив, в контроллер

Вариант 1: клиентский объект должен содержать только массив

 [
    {
      "To": "info@gmail.com",
      "Subject": "Subject",
      "Body": "Body",
      "ID": "d3d13242-6eff-4c57-b718-ef5ad49fe301"
    },
    {
      "To": "hr@gmail.com",
      "Subject": "Subject",
      "Body": "Body",
      "ID": "101edaf0-fcb4-48fc-9e9e-0d7492b591b0"
    }
  ]

Затем прочитайте массив из тела запроса

public async Task<IActionResult> Send([FromBody]Email[] emails)

Вариант 2: когда вы определяете массив как это в клиенте

{
  "emails":...
}

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

public class RequestModel
{
    public Email[] emails { get; set; }
}

Затем в методе контроллера, используйте модель и прочитайте ее из тела

public async Task<IActionResult> Send([FromBody]RequestModel emails)
Другие вопросы по тегам