当父类和子类有两个不同的规则集时,对子类的属性的验证不起作用。
这是类代码: 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; }
}
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);
}
你能帮帮忙吗?
发布于 2012-10-09 11:44:07
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
对象进行验证。
https://stackoverflow.com/questions/12798755
复制