这是我的带有数据注释的Test类:
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并重新验证时,我确实得到了验证异常(如预期的那样)。我的字符串长度注释没有被强制执行的任何想法?
答案 0 :(得分:22)
这有点不直观,但正在改变
Validator.ValidateObject(test, context);
到
Validator.ValidateObject(test, context, true);
解决了这个问题。第三个参数是bool validateAllProperties
。我不确定为什么[Required]
属性之前的[StringLength]
属性已被强制执行,但至少它现在都有效。
答案 1 :(得分:3)
感谢您发布此内容。我在此问题上发布了Microsoft Connect上的错误。我假设他们错误地跳过了System.String属性,因为它不是值类型,因为没有“validateAllProperties”参数它们不会进行深度/递归验证。