Пользовательский интерфейс ASP.Net Core JSON

MRP спросил: 28 апреля 2018 в 08:29 в: asp.net-core

Мой опубликованный объект 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, и, как вы можете видеть здесь, я всегда получаю null при отправке post для 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();
 }

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


1 ответ

Есть решение
Marcus Höglund ответил: 28 апреля 2018 в 09:12

Проблема заключается в том, что вы фактически отправляете объект, содержащий одно свойство с именем 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)