2011-03-22 179 views
19

我有以下代碼:日期時間(日期和時間)與數據註釋驗證

 [DisplayName("58.Date and hour of birth")] 
     [DataType(DataType.DateTime, ErrorMessage = "Please enter a valid date in the format dd/mm/yyyy hh:mm")] 
     [Range(typeof(DateTime), "1/1/2011", "1/1/2016")] 
     [RequiredToClose] 
     public object V_58 { get; set; } 

我想強制的時間列入(以hh:mm格式),並不僅僅是日期。此代碼認爲1/1/2011是有效的,因爲它不應該包含小時,任何有關如何表達正確格式的線索? (dd/mm/yyyy hh:mm)

+10

你應該考慮選擇一些你以前的問題的答案。 – 2011-03-22 14:52:14

回答

27

你可以自己寫ValidationAttribute並用它來裝飾房產。用你自己的邏輯覆蓋IsValid方法。

public class MyAwesomeDateValidation : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     DateTime dt; 
     bool parsed = DateTime.TryParse((string)value, out dt); 
     if(!parsed) 
      return false; 

     // eliminate other invalid values, etc 
     // if contains valid hour for your business logic, etc 

     return true; 
    } 
} 

最後,裝點你的財產:

[MyAwesomeDateValidation(ErrorMessage="You were born in another dimension")] 
public object V_58 { get; set; } 

注:警惕多重驗證的屬性在你的屬性,因爲它們被評估的順序是不能沒有更多的定製來確定,如果驗證邏輯重疊,那麼您的錯誤消息可能不會準確地描述您的意思是什麼意思是錯誤的屬性(是的,這是一個運行句)

+2

請記住,直接從ValidationAttribute繼承意味着內置的客戶端驗證將無法運行,因此最好從RegularExpressionAttribute繼承(像@ user329957那樣),以便內置的正則表達式可以自動在客戶。 – gdoten 2011-03-30 13:04:01

+0

IsValid需要公開,不受保護。 http://msdn.microsoft.com/en-us/library/cc679289.aspx。 – aknuds1 2012-10-17 11:52:06

0

如果您只是在一個字符串中傳遞日期,它會將其視爲12:00 AM。如果您想在字符串中傳遞時間,請使用「06/06/2011 7:00 PM」語法。

其他解決方法是將字符串保持原樣,根據需要將其轉換爲DateTime &,然後將AddHours & /或AddMinutes轉換爲DateTime對象。

4

終於用自定義ValidationAttribute解決了:

public class DateTimeValidation : RegularExpressionAttribute { 
    public DateTimeValidation() 
     : base(@"^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2})) (20|21|22|23|[0-1]?\d):[0-5]?\d$") { 
     ErrorMessage = "Date must be in the format of : dd/mm/yyyy hh:mm"; 
    } 
} 
0

此解決方案不允許輸入時間00.00,但將與其他值一起使用。

public class TimeRequiredAttribute : ValidationAttribute 
{ 
    protected override IsValid(object value) 
    { 
     DateTime result; 
     bool parsed = DateTime.TryParse((string)value, out result); 
     if(!parsed && DateTime.MinValue.TimeOfDay == result.TimeOfDay) 
     { 
      return false; 
     } 
     return true; 
    } 
} 

但它只適用於字符串proprety。