2010-10-30 101 views
3

与此相关的question定制DataTypeAttribute不触发验证正确

我已经创建了自己的DateValidationAttibute,以确保一个字符串是一个有效的日期格式(例如,MM/DD/YYYY)

​​

我试图用此代码测试此属性

[Test] 
    public void Test() 
    { 
     var invalidObject = new TestValidation {DateField = "bah"}; 
     var validationContext = new ValidationContext(invalidObject, null, null); 
     var validationResults = new System.Collections.Generic.List<ValidationResult>(); 

     bool result = Validator.TryValidateObject(invalidObject, validationContext, validationResults); 

     Assert.IsFalse(result); 
     Assert.AreEqual(1, validationResults.Count); 
    } 

    private class TestValidation 
    { 
     [DateValidation(ErrorMessage = "Invalid Date!")] 
     public string DateField { get; set; } 
    } 

不幸的是,这是行不通的。我在DateValidationAttribute构造函数和IsValid方法中放置了一个断点。它肯定会碰到构造函数,但从不碰到IsValid方法。有任何想法吗?

回答

0

我从来没有尝试使用DataTypeAttribute类创建ValidationAttributes,我不确定这是错误的,但扩展ValidationAttribute类一直对我有用。

“DataTypeAttribute在默认情况下不会进行任何验证,但它确实会影响有关数据呈现方式的模板。”从this question

例采取:

[AttributeUsage(AttributeTargets.Field, AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
public sealed class MyCustomAttribute : ValidationAttribute 
{ 
    public MyCustomAttribute() 
    : base("Custom Error Message: {0}") 
    { 
    } 

    public override bool IsValid(object value) 
    { 
    return true; 
    } 
} 
+0

更改我的示例以从ValidationAttribute进行扩展并没有帮助。请记住,DataTypeAttribute已经从ValidationAttribute扩展。 – manu08 2010-10-30 19:25:06

0

从MSDN link,注意只有所需的字段将被验证,任何其他验证。

此方法评估每个 ValidationAttribute实例,它是 附着到的对象类型。它还 检查是否提供了标记为RequiredAttribute的每个属性 是 。 它不递归地 验证 对象的属性值。

您需要将测试更改为此,请注意,我们在ValidationContext上设置了MemberName,并告诉Validator验证invalidObject.DateField属性。

[Test] 
public void Test() 
{ 
    var invalidObject = new TestValidation { DateField = "bah" }; 
    var validationContext = new ValidationContext(invalidObject,null , null){MemberName = "DateField"}; 
    var validationResults = new System.Collections.Generic.List<ValidationResult>(); 

    var result = Validator.TryValidateProperty(invalidObject.DateField, validationContext, validationResults); 

    Assert.IsFalse(result); 
    Assert.AreEqual(1, validationResults.Count); 
} 
+0

'只有必填字段将被验证,而不是任何其他验证'您的声明是错误的,该报价仅声称有效项未递归执行。这意味着,如果您有一个具有复杂类型属性的类,该类本身具有标记了验证属性的属性,则不验证这些**内部**属性。 – 2013-06-13 07:55:57

1

TryValidateObject方法有一个重载,它可以将一个布尔值validateAllProperties作为第四个参数。如果未指定,则默认为false,即仅检查某些属性。

[Test] 
public void Test() 
{ 
    var invalidObject = new TestValidation {DateField = "bah"}; 
    var validationContext = new ValidationContext(invalidObject, null, null); 
    var validationResults = new System.Collections.Generic.List<ValidationResult>(); 

    //Validate all attributes 
    bool result = Validator.TryValidateObject(invalidObject, validationContext, validationResults, true); 

    Assert.IsFalse(result); 
    Assert.AreEqual(1, validationResults.Count); 
}