ASP.NET Core 6 Web API可为空属性验证异常问题咨询
问题
在ASP.NET Core 6 Web API项目中,我定义了包含可为空ParentFolder属性的FolderDto类型,对应的POST接口接收该Dto对象。当在Swagger中测试时,我传入ParentFolder为空对象的请求,却收到“ParentFolder.FolderOwner字段为必填项”的验证错误。明明已将ParentFolder设为可为空,为何.NET仍会验证其属性?
相关代码
FolderDto定义
public class FolderDto { public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public Folder? ParentFolder { get; set; } }
POST接口代码
[HttpPost] public async Task<Folder> Post([FromBody] FolderDto folderDto) { var folder = mapper.Map<Folder>(folderDto); folder.FolderOwner = folderDto.ParentFolder?.FolderOwner ?? await userService.FindByIdAsync(1); folderService.CreateFolder(folder); return folder; }
测试请求体
{ "name": "string", "description": "string", "parentFolder": { } }
错误信息
"errors": { "ParentFolder.FolderOwner": [ "The FolderOwner field is required." ] }
解答
问题核心是你传入的不是null的ParentFolder,而是一个空对象{}。
当请求体里传{}时,ASP.NET Core会尝试实例化一个Folder对象,但Folder类中的FolderOwner是必填项(要么标记了[Required]特性,要么在.NET 6+的nullable上下文里是非可空引用类型),所以模型验证会触发,提示该字段必填。
如果你的需求是“不需要指定父文件夹”,正确的做法是把parentFolder设为null,或者直接从请求体里删掉这个字段:
{ "name": "string", "description": "string", "parentFolder": null }
要是你确实需要允许传入空的ParentFolder对象(而非null),可以修改Folder类的定义,把FolderOwner设为可空类型,或者移除它的必填验证:
public class Folder { // 将FolderOwner设为可空引用类型 public string? FolderOwner { get; set; } // 其他属性... }
内容的提问来源于stack exchange,提问作者Pablo52
相关产品推荐
相关产品推荐

