如何解决`[Required]` DataAnnotation 未验证 DTO
我有 DTO 来创建用户
public record IWriteDTO();
public record CreateUserDTO(string FirstName,string LastName,[Required] string UserName,[Required] string Email,List<CreateSkillDTO> Skills) : IWriteDTO;
电子邮件和用户名字段都使用 [Required]
中的 System.ComponentModel.DataAnnotations
属性装饰,但是当我使用带有空 UserName
和 Email
值的 swagger 端点时,控制器不会响应无效请求等
我发送请求的正文如下:
{
"firstName": "string","lastName": "string",//no UserName
//no email
"skills": [
{
"name": "string","description": "string"
}
]
}
用于创建用户的控制器
[HttpPost]
public async Task<ActionResult<UserDTO>> CreateUserAsync(CreateUserDTO user)
{
var createdUser = await _userService.CreateAsync(user);
return CreatedAtAction(nameof(GetUserAsync),new { id = createdUser.Id },createdUser);
}
我的控制器返回 201 和创建的 UserDTO
但是返回的 UserDTO 有 UserName: null
和 Email: null
这真的不是想要的行为
{
"id": "aef16a1d-3573-4676-9d9f-14ed26ac669a","firstName": "string","fullName": "string string","userName": null,"email": null,"skills": [
{
"id": "42c416a1-4203-406e-acba-8d35f2e73840","name": "string","description": "string"
}
]
}
在有人提出建议之前,我知道我可以编写流畅的验证,但我想解决这个问题并保持简单,因为目前我正在研究 MVP。
非常感谢所有花时间提供帮助的人
编辑 根据博客文章 here .NET 5 支持这种语法
解决方案 在查看时,我遇到了这个 post,并提供了建议作为链接检查 this post 我定位了该属性并且它有效
public record IWriteDTO();
public record CreateUserDTO(string FirstName,[property : Required] string UserName,[property : Required] string Email,List<CreateSkillDTO> Skills) : IWriteDTO;
这可能是关于在记录上使用注释的错误,但暂时解决了我的问题。
解决方法
模型解析器将使用您在从传入请求填充方法参数时指定的属性。但是你仍然要问它一切如何,就像这样:
if (!ModelState.IsValid)
{
return BadRequest();
}
// model is valid,proceed
您不仅可以使用 BadRequest()
进行回复,还可以构建更详细的回复,ModelState 对象具有帮助您完成此操作的属性。
有关详细信息,请参阅the docs。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。