流畅的验证 - 在一个自定义验证器中组合两个验证器

问题描述 投票:0回答:1

我有以下验证器类:

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个回答
3
投票

是的,它应该与这样的东西一起工作

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();

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

doc here

© www.soinside.com 2019 - 2024. All rights reserved.