2010-10-30 64 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); 
}