当我有 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
上运行时不会得到验证。