2011-01-23 90 views
8

这里是我的测试类数据注释:StringLengthAttribute似乎并不奏效

class Test 
{ 
    [Required, StringLength(10)] 
    public string MyProperty { get; set; } 
} 

这里是我的控制台测试程序:

class Program 
{ 
    static void Main(string[] args) 
    { 
    var test = new Test { 
     MyProperty = "this is way more than 10 characters and should fail." 
    }; 

    var context = new ValidationContext(test, null, null); 

    // No exception here! (why not?) 
    Validator.ValidateObject(test, context); 

    test.MyProperty = null; 

    // Exception here, as expected 
    Validator.ValidateObject(test, context); 
    } 
} 

出于某种原因,我没有得到一个当字符串长度过长时,验证异常。当我将该属性设置为null并重新验证时,确实收到了验证异常(如预期的那样)。任何想法为什么我的字符串长度注释没有被强制执行?

回答

19

这有点不直观,但改变

Validator.ValidateObject(test, context); 

Validator.ValidateObject(test, context, true); 

解决了这个问题。第三个参数是bool validateAllProperties。我不知道为什么[Required]属性先前被强制执行,而[StringLength]不是,但至少现在都可以使用。

3

感谢您发布此信息。我在这个问题上发布了Microsoft Connect的一个错误。我假设他们不正确地跳过一个System.String属性,因为它不是一个值类型,因为他们没有“validateAllProperties”参数不做深度/递归验证。

下面是错误链接,如果您有兴趣: https://connect.microsoft.com/VisualStudio/feedback/details/672247/system-componentmodel-dataannotations-validator-does-not-validate-stringlengthattribute-unless-validateallproperties-specified