Пользовательское связующее модель ASP.Net Core JSON - PullRequest
0 голосов
/ 22 мая 2018

Мой опубликованный объект 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 Ответ

0 голосов
/ 22 мая 2018

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

Опция один : объект клиента должен содержать только массив

 [
    {
      "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":...
}

Вам необходимо сопоставить настройку этого объекта на контроллере, определив модель, которая содержит свойство с именем emails

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

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

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