0

我有以下验证器类:

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

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

4

1 回答 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();

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

文档在这里

于 2012-09-19T16:22:30.823 回答