0

當我有2個不同的父子規則集時,子類的屬性驗證不起作用。企業驗證爲父級子類阻止不同的子集

這是類代碼:MyType的是家長和人是孩子

[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根據規則集驗證您的對象並連接驗證結果。這是Validation.Validate方法是什麼樣子:

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; 

換句話說,在一個單一的規則集一直執行的對象上的驗證。由於ObjectValidator僅針對RulesetA進行了修飾,因此在RulesetB上運行時Person對象將不會得到驗證。