首页 > 解决方案 > 使用 .NET 6 在 ASP.NET Core 中处理 API 调用中的空子类

问题描述

我刚刚使用 .NET 6 将我的后端 API 升级到 ASP.NET Core,并且如果POST调用包含空子类,则开始出现错误。

这是一个例子。我的 API 接收POST对评论条目的调用,处理这些调用的类如下所示:

public class CommentEntry
{
   [Required]
   public string Comments { get; set; }

   public DateTime EntryDate { get; set; }

   public File Attachment { get; set; }
}

如您所见,这个类有一个File附件的子类。该类File如下所示:

public class File
{
   public Guid Id { get; set; }

   public string Name { get; set; }

   public string Url { get; set; }
}

当我的 API 使用 .NET 5 运行 ASP.NET Core 时,我可以发送POST一个如下所示的请求,该请求发送一个空对象作为attachment属性,它可以正常工作:

{
   "comments": "Hello World!",
   "entryDate: "2021-11-13T14:52",
   "attachment": {}
}

现在,我的控制器操作方法因!ModelState.IsValid线路而拒绝此操作。

如果我将POST请求更改为以下内容,那么它也可以在 .NET 6 中使用。

{
   "comments": "Hello World!",
   "entryDate: "2021-11-13T14:52",
   "attachment: {
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "",
      "url": ""
   }

}

正如您在CommentEntry课堂上看到的,不需要附件。

在我没有子类数据的情况下,处理这种情况的正确方法是什么?我不应该在POST通话中发送空对象吗?

标签: c#asp.netasp.net-coreasp.net-web-api.net-6.0

解决方案


似乎属性绑定不喜欢“空”对象。我的猜测是它会尝试将属性设置为 null。然而,.net 6 比旧框架有更严格的政策,当涉及到将事物设置为 null 时。

当您专门将属性类型设置为可为空时,.net 6 知道您是故意这样做的。简而言之,您应该这样做:

public File? Attachment { get; set; }

所以 asp.net core 知道这null没关系。


推荐阅读