ASP.NET Core 6 API调用中如何处理POST请求里的空子类对象问题
问题根因
ASP.NET Core 6默认开启了两个新特性,共同导致了这个校验失败问题:
- .NET 6新建项目默认启用可空引用类型,你的
File类中Name、Url均为非可空string类型,ASP.NET Core会自动为这类属性添加隐式[Required]校验规则 - 当你传入
"attachment": {}时,反序列化会生成一个File实例,但它的Name、Url属性均为null,触发隐式必填校验,最终ModelState校验失败
.NET 5默认未启用可空引用类型,没有这套隐式校验逻辑,所以空对象可以正常通过。
推荐解决方案
你可以根据业务需求选择以下任意一种方案:
方案1:显式声明可空属性(最推荐)
如果File类的Name、Url本身就是非必填字段,直接修改为可空字符串即可,完全符合语义,也不需要修改前端请求逻辑:
public class File { public Guid Id { get; set; } public string? Name { get; set; } public string? Url { get; set; } }
方案2:关闭全局隐式校验
如果你不想修改现有实体类定义,可以在Program.cs中配置关闭非可空引用类型的隐式必填校验,回到和.NET 5完全一致的行为:
builder.Services.AddControllers() .ConfigureApiBehaviorOptions(options => { options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true; });
方案3:调整请求传参逻辑
如果业务上没有附件数据,更符合REST规范的做法是请求中直接传"attachment": null,或者干脆省略attachment字段,此时反序列化后CommentEntry.Attachment属性为null,自然不会触发File类内部的属性校验,不需要修改后端任何配置。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

