【问题标题】:MVC C# - FluentValidation Composite Validator for multiple AbstractValidator<T>MVC C# - 多个 AbstractValidator<T> 的 FluentValidation 复合验证器
【发布时间】:2015-10-29 19:54:35
【问题描述】:

我有一个 MVC 应用程序,每个视图模型有很多 AbstractValidator&lt;T&gt;。这是设计使然,因为我使用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;
        });
    }
  }}

【问题讨论】:

    标签: c# asp.net-mvc validation fluentvalidation


    【解决方案1】:

    这确实有效。我发现一个我忘记的验证拦截器没有触发我的验证。

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2011-12-03
      • 2023-01-04
      • 2019-09-17
      相关资源
      最近更新 更多