2015-07-21 4 views
1

У меня есть класс, который повторно используется в нескольких местах. К нему применен валидатор по умолчанию, который имеет следующий атрибут: [Validator (typeof (ChildValidator))].Свободная проверка Валидация объекта Vary в соответствии с классом, который используется в

Я хотел бы переопределить валидатор, примененный к классу Child, в зависимости от используемого родительского класса. Ниже приведена упрощенная версия моей модели. Поэтому вместо проверки Child с ChildValidator я хочу применить правила в ChildValidator2. Это можно сделать?

Примечание: код последующих всегда будет терпеть неудачу проверку, потому что он всегда будет применять правила в ChildValidator

Модели:

[Validator(typeof(ParentValidator))] 
    public class Parent 
    { 
     public bool IgnoreChild { get; set; } 
     public DateTime Birthdate { get; set; } 

     public Child Children { get; set; } 
    } 

    [Validator(typeof(ChildValidator))] 
    public class Child 
    { 
     public string ChildProperty{ get; set; } 
     public DateTime Birthdate { get; set; } 
    } 

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

public class ParentValidator : AbstractValidator<Parent> 
{ 
    public ParentValidator() 
    { 
     RuleFor(model => model.Name).NotEmpty(); 

     When(x=>x.IgnoreChild,() => 
     { 
      RuleForEach(model => model.Child).SetValidator(new ChildValidator2()); 
     }); 
    } 
} 

public class ChildValidator : AbstractValidator<Child> 
{ 
    public ChildValidator() 
    { 
     RuleFor(model => model.ChildProperty).NotEmpty(); 
     //Compare birthday to make sure date is < Parents birthday 
    } 
} 



public class ChildValidator2 : AbstractValidator<Child> 
{ 
    public ChildValidator2() 
    { 
     RuleFor(model => model.ChildProperty).Empty(); 
    } 
} 
+0

«Сравнить день рождения, чтобы убедиться, что дата <Родители день рождения» remided «Не грози южному централу, попивая сок в капот" :) –

ответ

0

Если вы отлаживать FluentValidation исходный код , вы увидите, что AttributedValidatorFactory работает только для параметров действия контроллера (Parent), а не для классов детской собственности (Child). Если вы не применяли валидатор по методу SetValidator() - никакие действия проверки не выполнялись. Таким образом, результаты вашего эксперимента могут быть вызваны другой причиной, а не тем, кто вы.

Попробуйте указать валидаторы явно для обоих значений IgnoreChild флага:

public class ParentValidator : AbstractValidator<Parent> 
{ 
    public ParentValidator() 
    { 
     RuleFor(model => model.Name).NotEmpty(); 

     When(x=> x.IgnoreChild,() => 
     { 
      RuleForEach(model => model.Child).SetValidator(new ChildValidator2()); 
     }); 
     When(x=> !x.IgnoreChild,() => 
     { 
      RuleForEach(model => model.Child).SetValidator(new ChildValidator()); 
     }); 
    } 
} 

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

  • Нет связанных вопросов^_^