企业验证 阻止父子类的不同 rulset



当我有 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,但它是真的)

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

你能帮忙吗?

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而装饰,因此Person对象在RulesetB上运行时不会得到验证。

最新更新