0

親と子に 2 つの異なるルールセットがある場合、子クラスのプロパティの検証が機能しません。

これはクラス コードです。Mytype は親で、Person は子です。

    [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);
    }

助けてくださいませんか?

4

1 に答える 1

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;

つまり、オブジェクトの検証は常に 1 つのルールセットで実行されます。はObjectValidatorに対してのみ装飾されているため、 で実行されている場合RulesetAPersonオブジェクトは検証されませんRulesetB

于 2012-10-09T11:44:06.817 に答える