【问题标题】:How I'm suppose to validate a DTO?我应该如何验证 DTO?
【发布时间】:2020-01-04 17:46:37
【问题描述】:

我正在尝试在 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 中放置数据注释或任何验证逻辑?这将如何成为“更清洁”的解决方案?

【问题讨论】:

  • 您如何定义“更清洁”?如果没有注释,您将不得不自己编写验证代码。那会更“干净”吗?
  • @RobertHarvey 没错!如果它适合这种场景,为什么我不在 dtos 中使用数据注释?
  • 没有什么能阻止您编写自己的验证代码。
  • 这个案子会不会有点矫枉过正?
  • 这是您的决定。

标签: c# .net api validation dto


【解决方案1】:

如果您需要实现更复杂的验证逻辑,最好使用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);
        }
    }

【讨论】:

  • 我不知道这种方法,我会检查一下。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2016-08-10
  • 2021-09-19
  • 1970-01-01
  • 2022-01-19
  • 2011-05-19
相关资源
最近更新 更多