一次为DataAnnotation和IValidatableObject显示所有验证错误

时间:2014-02-22 01:21:20

标签: c# .net asp.net-mvc data-annotations

我可以验证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;哪个是第一类数据注释?

我怎样才能返回五个错误?

1 个答案:

答案 0 :(得分:0)

我认为是因为DataAnotations.Validator.GetObjectValidationErrors中的代码在第一个属性错误之后启动,从而使其余的验证规则短路。你可以通过在Validate()方法中进行所有验证来解决这个问题。