我应该如何验证 DTO?
How I'm suppose to validate a DTO?
我正在尝试使用 C# 中的 .net 创建 Web API
虽然在我的研究中我遇到过在 dtos 中放置验证代码或数据注释属性是一个很大的禁忌,但我看到的每个教程都有这行内容
[HttpPost]
public IActionResult Post(SomeDto someDto)
{
if (ModelState.IsValid){
//DoStuff();
}
}
如果我没记错,ModelState.IsValid 检查参数是否满足 SomeDto dto 的验证要求。例如:
public class SomeDto
{
[Range(0, 10, ErrorMessage = "Price cannot be more that 10")] //this
public decimal Price { get; set; }
}
因此我的问题是,我是否应该在 DTO 中放置数据注释或任何验证逻辑? "cleaner" 如何解决这个问题?
如果您需要实施更复杂的验证逻辑,最好使用 FluentValidator
等工具。在这种情况下,您可以分离 类 并定义自定义验证逻辑,并为操作使用验证属性或类似这样的内容:
var validationResult = new MyModelValidator().Validate(dto);
将验证逻辑与模型定义文件分开,可以以不同的方式验证 dto
的创建和更新。验证器将是这样的:
public class MyModelValidator: AbstractValidator<SomeDto>
{
public MyModelValidator()
{
RuleFor(x => x.Id)
.Empty()
.WithMessage(DefaultMessages.InvalidInput);
RuleFor(x => x.Name)
.NotEmpty()
.WithMessage(DefaultMessages.InvalidName)
.Length(2, 80)
.WithMessage(DefaultMessages.InvalidName);
}
}
我正在尝试使用 C# 中的 .net 创建 Web API
虽然在我的研究中我遇到过在 dtos 中放置验证代码或数据注释属性是一个很大的禁忌,但我看到的每个教程都有这行内容
[HttpPost]
public IActionResult Post(SomeDto someDto)
{
if (ModelState.IsValid){
//DoStuff();
}
}
如果我没记错,ModelState.IsValid 检查参数是否满足 SomeDto dto 的验证要求。例如:
public class SomeDto
{
[Range(0, 10, ErrorMessage = "Price cannot be more that 10")] //this
public decimal Price { get; set; }
}
因此我的问题是,我是否应该在 DTO 中放置数据注释或任何验证逻辑? "cleaner" 如何解决这个问题?
如果您需要实施更复杂的验证逻辑,最好使用 FluentValidator
等工具。在这种情况下,您可以分离 类 并定义自定义验证逻辑,并为操作使用验证属性或类似这样的内容:
var validationResult = new MyModelValidator().Validate(dto);
将验证逻辑与模型定义文件分开,可以以不同的方式验证 dto
的创建和更新。验证器将是这样的:
public class MyModelValidator: AbstractValidator<SomeDto>
{
public MyModelValidator()
{
RuleFor(x => x.Id)
.Empty()
.WithMessage(DefaultMessages.InvalidInput);
RuleFor(x => x.Name)
.NotEmpty()
.WithMessage(DefaultMessages.InvalidName)
.Length(2, 80)
.WithMessage(DefaultMessages.InvalidName);
}
}