簡體   English   中英

MVC C#-用於多個AbstractValidator的FluentValidation復合驗證器<T>

[英]MVC C# - FluentValidation Composite Validator for multiple AbstractValidator<T>

我有一個MVC應用程序,每個視圖模型都有許多AbstractValidator<T> 這是設計SimpleInjector ,因為我使用SimpleInjector注入查詢以訪問我們的數據庫,並且我不想在一個驗證器中使用構造函數進行注入。 我在下面創建了用於每個視圖模型的驗證器的類,但它沒有調用我的When和其他自定義驗證規則,僅調用了簡單規則。 任何幫助將不勝感激。 謝謝。

public class CompositeValidator<T> : AbstractValidator<T>
  {
    private ICollection<IValidator> _validators = new List<IValidator>();

    public CompositeValidator(IEnumerable<IValidator<T>> validators = null)
    {
      if (validators == null) return;

      foreach (var validator in validators)
        {
        _validators.Add(validator);

        var enumerator = validator.GetEnumerator();

        while (enumerator.MoveNext())
        {
          AddRule(enumerator.Current);
        }
      }
    }

    public override ValidationResult Validate(ValidationContext<T> context)
    {
      var errorsFromOtherValidators = _validators.SelectMany(x => x.Validate(context).Errors);

      return new ValidationResult(errorsFromOtherValidators );
    }
  }

這是兩個驗證器的示例

public class PersonValidator : AbstractValidator<PersonVm>
  {
    public PersonValidator()
    {
      RuleFor(model => model.FirstName).NotEmpty();
      RuleFor(model => model.LastName).NotEmpty();
    }
  }

  public class PersonMustBeRegisteredValidator : AbstractValidator<PersonVm>
  {
    private readonly IQuery<PersonExists> _query;

    public PersonMustBeRegisteredValidator(IQuery<ReturnPerson> query)
    {
      _query = query;

      Custom(model =>
        {
          var person = _query.Select(new { model.Id });

          if (person == null) return new ValidationFailure("Id", "Person does not exist");

           return null;
        });
    }
  }}

這實際上有效。 我發現我忘記的驗證攔截器沒有觸發我的驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM