【问题标题】:Enterprise Validation Block different rulsets for parent child classes企业验证阻止父子类的不同规则集
【发布时间】:2012-10-09 11:09:41
【问题描述】:

当我为父子类有 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);
    }

你能帮忙吗?

【问题讨论】:

  • 我认为您应该从[ObjectValidator] 中删除Ruleset = "RulesetA"。只需使用:[ObjectValidator] 来装饰该属性。这可确保 Person 始终得到验证。
  • 不,它仍然失败:(
  • 当您将[ObjectValidator("RulesetB", Ruleset = "RulesetB")](和RulesetA)添加到Person 属性时?
  • 它有效,但我的问题是为什么它在我的情况下不起作用,即使我正在验证所有规则集:Validation.Validate(target, new string[] {"RulesetA", "RulesetB"} );

标签: c# .net validation enterprise-library validation-application-bl


【解决方案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 进行修饰,因此Person 对象在RulesetB 上运行时不会得到验证。

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多