0

부모 및 자식에 대해 2 개의 다른 규칙 집합이있을 때 자식 클래스의 속성에 대한 유효성 검사가 작동하지 않습니다. MYTYPE가 부모와 사람 아이엔터프라이즈 유효성 검사 부모 자식 클래스에 대해 다른 rululets를 차단합니다.

[HasSelfValidation] 
    public class MyType 
    { 
     [SelfValidation(Ruleset = "RulesetA")] 
     [SelfValidation(Ruleset = "RulesetB")] 
     public void DoValidate(ValidationResults results) 
     { 
     } 

     [NotNullValidator(Ruleset = "RulesetA")] 
     [ObjectValidator("RulesetA", Ruleset = "RulesetA")] 
     public Person Person { get; set; } 

    } 

    public class Person 
    { 
     [NotNullValidator(Ruleset = "RulesetB")] 
     public string GivenName { get; set; } 

    } 

이 모든 규칙 세트에 대해합니다 MyType 클래스를 검증하는 사용자 정의 유효성 검사기 클래스입니다 :

클래스 코드

public interface IValidator<T> 
    { 
     ValidationResults Validate(T target); 
    } 

    public class MyValidator : IValidator<MyType> 
    { 
     public ValidationResults Validate(MyType target) 
     { 
      return Validation.Validate(target, new string[] {"RulesetA", "RulesetB"}); 
     } 
    } 

그리고 이것이 실패한 테스트 : (IsValid를 False로 설정해야하지만 True 임)

[TestMethod] 
    public void Should_return_false_when_validating_MyType_without_PersonApplying_GivenName() 
    { 
     //arrange 
     var myType = new MyType() 
          { 
           Person= new Person() 
          }; 
     myType.Person.GivenName = null; 

     //act 
     MyValidator _validator = new MyValidator(); 
     var resultList = _validator.Validate(myType); 

     //assert 
     Assert.IsFalse(resultList.IsValid); 
    } 

Wou 너 도와 줘?

+0

'[ObjectValidator]'에서'Ruleset = "RulesetA"를 제거해야한다고 생각합니다. 그 속성을'[ObjectValidator]'로 장식하면됩니다. 이것은'Person'이 항상 유효성을 확인하도록합니다. – Steven

+0

아니 여전히 실패 : ( – mk78

+0

그리고'[ObjectValidator ("RulesetB", Ruleset = "RulesetB")]'(및'RulesetA')를'Person' 속성에 추가 할 때? – Steven

답변

1

VAB는 규칙 집합 당 개체의 유효성을 검사하고 유효성 검사 결과를 연결합니다. 즉

var resultsReturned = new ValidationResults(); 

foreach (string ruleset in rulesets) 
{ 
    var validator = ValidationFactory.CreateValidator(
     targetType, ruleset, source); 

    foreach (var validationResult in validator.Validate(target)) 
    { 
     resultsReturned.AddResult(validationResult); 
    } 
} 

return resultsReturned; 

는, 객체의 검증은 항상 하나의 규칙 세트에서 수행됩니다 :이 같은 Validation.Validate 방법은 모습입니다. ObjectValidatorRulesetA으로 만 꾸며 졌으므로 RulesetB에서 실행하면 Person 개체의 유효성이 검사되지 않습니다.

관련 문제