我可以验证Data Annotation和IValidatableObject,当这些对象是简单对象时。但是,在对象具有必须验证的属性的情况下,事情就会出错。
public class BaseClass
{
public IEnumerable<ValidationResult> Validate()
{
var results = new List<ValidationResult>();
var validationContext = new ValidationContext(this, null, null);
Validator.TryValidateObject(this, validationContext, results, true);
return results;
}
}
public class Class1 : BaseClass, IValidatableObject
{
public Class1()
{
Property1 = new Class2();
}
public Class2 Property1 { get; set; }
//[Required]
public string AString1 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var e = new ValidationResult("Error from class1");
var s = Property1.Validate();
var r = new List<ValidationResult>(s) { e };
return r;
}
}
public class Class2 :BaseClass, IValidatableObject
{
public Class2()
{
Property2 = new Class3();
}
public Class3 Property2 { get; set; }
//[Required]
public string AString2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
yield return new ValidationResult("Error from class2");
}
}
public class Class3:BaseClass
{
//[Required]
public string AString3 { get; set; }
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var s = new Class1();
var results = s.Validate();
Assert.AreEqual(5, results.Count());
}
}
这个小代码片段返回2个错误。这两个来自IValidatableObject的Validate方法。这可以。但是,如果我取消注释三个&#34;必需&#34;数据注释我应该有5个错误(2个来自Validate方法,3个来自数据注释)。
为什么当我取消注释三个数据注释时我只有一个错误&#34; 需要AString1字段。&#34;哪个是第一类数据注释?
我怎样才能返回五个错误?
答案 0 :(得分:0)
我认为是因为DataAnotations.Validator.GetObjectValidationErrors中的代码在第一个属性错误之后启动,从而使其余的验证规则短路。你可以通过在Validate()方法中进行所有验证来解决这个问题。