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")持つバリデータは、すべてのプロパティで同じです。それらを1つのカスタムバリデーターにグループ化してから、次のように書くことは可能ですか:

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 に答える