2013-11-27 3 views
0

Скажем, у меня есть классы, как это:Есть ли способ сделать FluentValidation прекратить обработку других правил без установки CascadeMode для всех правил?

public class ParentClass 
{ 
    public ChildClass Child { get; set; } 
    public DateTime Date { get; set; } 
} 
public class ChildClass 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

И валидатор так:

public class ParentClassValidator : AbstractValidator<ParentClass> 
{ 
    public ParentClassValidator() 
    { 
     RuleFor(x => x.Child).NotNull(); 
     RuleFor(x => x.Date).Must((parent, date) => 
      date < parent.Child.EndDate && date > parent.Child.StartDate); 
     // ...other rules. 
    } 
} 

Можно сказать FluentValidation остановить проверку правил, если первый не удается (например, для детей является нулевым) , но выполнять все другие правила, независимо от отказа, если это пройдет?

то я действительно хочу что-то вроде:

public ParentClassValidator() 
{ 
    RuleFor(x => x.Child).NotNull().StopOnFailure(); 
    RuleFor(x => x.Date).Must((parent, date) => date < parent.Child.EndDate && date > parent.Child.StartDate); 
    // ...other rules. 
} 

Я знаю, что я могу установить CascadeMode = CascadeMode.StopOnFirstFailure, но это будет сделать все неудачи правило прекратить проверку. Честно говоря, в этом случае я просто хочу сохранить FluentValidation из того, что выбрал исключение из-за попытки получить доступ к parent.Child, который он уже знает как null!

+1

Для этого примера вы должны иметь возможность использовать [When] (http://fluentvalidation.codeplex.com/wikipage?title=Customizing&referringTitle=Documentation&ANCHOR#WhenUnless), хотя для этого потребуется дублировать непустую проверку между валидацией и когда предикат. –

+0

Bleh. Это не очень чистый способ сделать это :(Я подозреваю, что это единственный способ. – adhocgeek

+0

Я подозреваю это также: см. Http://fluentvalidation.codeplex.com/discussions/352581 –

ответ

0

A (не то, что хороший способ), чтобы достичь того, чего вы хотите бы, чтобы использовать не пуст CTOR

public class ParentClassValidator : AbstractValidator<ParentClass> 
{ 
    public ParentClassValidator(bool childIsNotNull) 
    { 
     RuleFor(x => x.Child).NotNull(); 

    if (childIsNotNull) { 
     RuleFor(x => x.Date).Must((parent, date) => 
      date < parent.Child.EndDate && date > parent.Child.StartDate); 
     // ...other rules. 
    } 
} 

}

, то вы можете использовать его таким образом:

new ParentClassValidator(model.Child != null).ValidateAndThrow() 

Но это зависит от того, как вы используете для вызова своего валидатора ... «Автоматический» вызов (с атрибутами) невозможен, вам нужно будет позвонить ValidateAndThrow «вручную», и это как-то сломает нас возраст валидатора.

Смежные вопросы