【问题标题】:Fluent validation - group two validators in one custom validator流畅的验证 - 将两个验证器组合到一个自定义验证器中
【发布时间】:2012-09-13 08:08:55
【问题描述】:

我有以下验证器类:

public class FranchiseInfoValidator : AbstractValidator<FranchiseInfo>
    {
        public FranchiseInfoValidator()
        {
            RuleFor(franchiseInfo => franchiseInfo.FolderName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");
            RuleFor(franchiseInfo => franchiseInfo.ExeIconName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");
            RuleFor(franchiseInfo => franchiseInfo.FullName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");
            RuleFor(franchiseInfo => franchiseInfo.ShortName).NotEmpty().Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters");        
    }

NotEmpty()Matches("^[a-zA-Z0-9_.:-]+$").WithMessage("Invalid characters") 带有自定义消息的验证器对于所有属性都是相同的。是否可以将它们分组到一个自定义验证器中,然后编写如下内容:

RuleFor(franchiseInfo => franchiseInfo.FolderName).SetValidator(new CustomValidator());

我已经做了一些自定义验证器,但不是在这种情况下。这可能吗?我在文档中没有找到这样的例子。此外,我想知道这是否可以通用,所以如果我有另一个具有属性的验证器类来应用相同的自定义验证器?谢谢。

【问题讨论】:

    标签: fluentvalidation


    【解决方案1】:

    是的,它应该与类似的东西一起使用

    public class MyCustomValidator : PropertyValidator
        {
    
            public MyCustomValidator()
                : base("Property {PropertyName} has invalid characters.")
            {
            }
    
            protected override bool IsValid(PropertyValidatorContext context)
            {
                var element = context.PropertyValue  as string;
                return !string.IsNullOrEmpty(element) && Regex.IsMatch(element, "^[a-zA-Z0-9_.:-]+$");
            }
        }
    

    用法: 使用您的代码,或创建您自己的扩展程序

    public static class MyValidatorExtensions {
       public static IRuleBuilderOptions<T, string> CheckIfNullAndMatches<T>(this IRuleBuilder<T, string> ruleBuilder) {
          return ruleBuilder.SetValidator(new MyCustomValidator<TElement>());
       }
    }
    

    那么用法就是

    RuleFor(franchiseInfo => franchiseInfo.FolderName).CheckIfNullAndMatches();
    

    如果您需要更通用的验证器,您也可以使用正则表达式作为参数...

    文档here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多