2009-08-31 62 views
7

我有一個具有PhoneNumber和Email屬性的客戶類。使用DataAnnotations我可以使用DataType驗證屬性修飾屬性,但我看不到讓我感覺到的是什麼。關於DataType的工作方式,有沒有關於數據註釋的很好的參考?

例如:

[DataType(DataType.PhoneNumber)] 
public string PhoneNumber {get; set;} 

我有分配 「1515999A」 這個屬性一個單元測試。當我逐步驗證跑步者時,該值被認爲對電話號碼有效。我原以爲這應該是無效的。

我google'd圍繞一些,但無法找到各種枚舉DataTypes實際上捕獲什麼樣的解釋。有什麼值得參考的地方?

編輯:

下面是我用什麼驗證亞軍的膽量......

public virtual XLValidationIssues ValidateAttributes<TEntity>(TEntity entity) 
    { 
     var validationIssues = new XLValidationIssues(); 

     // Get list of properties from validationModel 
     var props = entity.GetType().GetProperties(); 

     // Perform validation on each property 
     foreach (var prop in props) 
      ValidateProperty(validationIssues, entity, prop); 

     // Return the list 
     return validationIssues; 
    } 

    protected virtual void ValidateProperty<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property) 
    { 
     // Get list of validator attributes 
     var validators = property.GetCustomAttributes(typeof(ValidationAttribute), true); 
     foreach (ValidationAttribute validator in validators) 
      ValidateValidator(validationIssues, entity, property, validator); 
    } 

    protected virtual void ValidateValidator<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property, ValidationAttribute validator) 
    { 
     var value = property.GetValue(entity, null); 
     if (!validator.IsValid(value)) 
      validationIssues.Add(new XLValidationIssue(property.Name, value, validator.FormatErrorMessage(property.Name, value))); 
    } 
+0

驗證這是在框架3.5或4.0?你使用哪個驗證跑步者? – 2009-08-31 14:31:47

+0

好評。我使用3.5,我使用了一個相當簡單的自定義驗證運行器(發佈上面的代碼)。 – 2009-09-01 14:24:49

回答

7

我找不到太多關於DataType.PhoneNumber在網絡上,但我沒有找到這樣的:

http://forums.asp.net/p/1370546/2863383.aspx

在RTM版本中, DataType.EmailAddress僅用於 標記您自己使用的數據類型 。

我想找出更多,所以我拿出紅門的.NET反射器,並開始挖掘。

查看DataTypeAttribute類,Joseph Daigle是發現 - 每個DataType屬性不做任何驗證;總是返回真(即「有效」)。在某些數據類型上,一些自定義顯示字符串格式化已完成。然而,電話號碼幾乎不變。

所以,我研究了這個問題的可能的解決方案。從我發現,this看起來像最好的:

public class EvenNumberAttribute : ValidationAttribute 
{ 
    public EvenNumberAttribute() : base(() => Resource1.EvenNumberError) { } 
    public EvenNumberAttribute(string errorMessage) : base(() => errorMessage) { } 

    protected override ValidationResult IsValid(object value, 
     ValidationContext validationContext) 
    { 
     if (value == null) 
     { 
      return ValidationResult.Success; 
     } 

     int convertedValue; 
     try 
     { 
      convertedValue = Convert.ToInt32(value); 
     } 
     catch (FormatException) 
     { 
      return new ValidationResult(Resource1.ConversionError); 
     } 

     if (convertedValue % 2 == 0) 
     { 
      return ValidationResult.Success; 
     } 
     else 
     { 
      return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
     } 
    } 
} 

當然,這驗證了一個數是否是奇數還是偶數。你可以爲PhoneNumber,Email等寫一個自定義驗證屬性,實際上確實是驗證。

+0

我看到這個問題沒有在我的清單中回答,並且意識到您確實已經正確回答了,並且應該被標記爲這樣。對不起,延遲很長。 – 2010-12-13 14:16:27

+0

沒問題 - 很高興它有幫助,並感謝你:) – Doug 2010-12-14 16:41:56

1

的DataTypeAttribute是ValidationAttribute。但它總是返回真實的...所以它不做任何真正的驗證。

(我知道這是真正的3.5,我不知道如果這是真的爲4.0)

+0

我是相當新的MVC,並想知道如果它總是返回true,我應該關心設置它是哪種類型?這將如何改進我的代碼? – 2010-06-08 04:56:57

+0

DataTypeAttribute不是爲驗證而設計的。數據註釋就是:註釋數據的屬性。一些用於驗證,另一些用於簡單描述數據代表的內容。 – 2010-06-08 15:03:11

0

也許它,因爲電話號碼可以包含字母? wiki

3

電話號碼,郵政編碼應與RegularExpressionAttribute Class

+0

除非你能告訴我一個實際上針對當前RFC進行驗證的正則表達式,否則只能通過發送測試郵件到地址來驗證電子郵件。我厭倦了那些告訴我我的地址中不能有「+」的網站,或者我的頂級域名無效。 – slipsec 2013-07-03 20:23:14