自定义 ASP.Net 核心 JSON 模型活页夹

Custom ASP.Net Core JSON model binder

我的 posted 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();
 }

emails 属性 总是 null。对于创建可处理此类 JSON 对象的自定义模型活页夹,我将不胜感激。

问题是您实际上是在向控制器发送一个包含一个 属性 命名电子邮件的对象,而不是一个数组

选项一: 客户端对象只需要包含数组

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

然后在controller方法中,使用model,从body中读取

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