Пользовательский механизм связывания модели 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)