Asp.net core 自定义ASP.Net核心JSON模型绑定器

Asp.net core 自定义ASP.Net核心JSON模型绑定器,asp.net-core,asp.net-core-mvc,custom-model-binder,Asp.net Core,Asp.net Core Mvc,Custom Model Binder,我发布的JSON对象如下: {{ "emails": [ { "To": "info@gmail.com", "Subject": "Subject", "Body": "Body", "ID": "d3d13242-6eff-4c57-b718-ef5ad49fe301" }, { "To": "hr@gmail.com",

我发布的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发送post请求时,我总是得到null:

[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();
 }
[HttpPost,路由(“发送”)]
公共异步任务发送(电子邮件[]电子邮件)
{
var toSave=来自电子邮件中的电子邮件
选择新的EmailQueueItem
{
Html=true,
To=电子邮件。To,
主题=email.Subject,
Body=email.Body
};
等待Database.BulkInsert(toSave.ToArray());
返回Ok();
}

电子邮件属性始终为空。如果能为创建自定义模型绑定器以处理此类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"
    }
  ]
然后从请求主体读取数组

public async Task<IActionResult> Send([FromBody]Email[] emails)
您需要通过定义一个包含名为email的属性的模型来匹配控制器上的对象设置

public class RequestModel
{
    public Email[] emails { get; set; }
}
然后在控制器方法中,使用模型并从主体读取它

public async Task<IActionResult> Send([FromBody]RequestModel emails)
公共异步任务发送([FromBody]RequestModel电子邮件)
public async Task<IActionResult> Send([FromBody]RequestModel emails)