2011-03-22 11 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 में) के लिए मजबूर करना चाहते हैं। यह कोड 1/1/2011 को वैध मानता है जब इसे नहीं करना चाहिए क्योंकि यह समय को कम नहीं करता है, सही प्रारूप को व्यक्त करने के तरीके के बारे में कोई सुराग? (डीडी/एमएम/yyyy एचएच: मिमी)

+10

आपको अपने पिछले प्रश्नों के उत्तर चुनने पर विचार करना चाहिए। –

उत्तर

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; } 

नोट:, अपने गुणों पर जिम्मेदार बताते हैं कई मान्यता से सावधान रहें रूप में वे किस क्रम में मूल्यांकन किया जाता है और अधिक अनुकूलन के बिना निर्धारित किया जा करने में असमर्थ है, और बाद में सत्यापन तर्क overlaps हैं, तो आपके त्रुटि संदेश सटीक रूप से नहीं हो सकता है वास्तव में क्या आप संपत्ति (हां, यह है एक रन-ऑन वाक्य)

+2

ध्यान रखें कि ValidationAttribute से सीधे विरासत का अर्थ है कि अंतर्निहित क्लाइंट-साइड सत्यापन संचालित नहीं होगा, इसलिए यह RegularExpressionAttribute (जैसे @ user329957 करता है) से प्राप्त करने के लिए शायद बेहतर है ताकि अंतर्निहित रेगेक्स सामग्री स्वचालित रूप से काम करेगी ग्राहक। – gdoten

+0

IsValid को सार्वजनिक होने की आवश्यकता है, संरक्षित नहीं है। http://msdn.microsoft.com/en-us/library/cc679289.aspx। – aknuds1

0

यदि आप बस एक स्ट्रिंग में तारीख पास करते हैं तो यह 12:00 बजे के रूप में विचार करेगा। यदि आप एक स्ट्रिंग उपयोग "06/06/2011 7:00 अपराह्न" वाक्यविन्यास के भीतर समय बीतना चाहते हैं।

अन्य वर्कअराउंड आपकी स्ट्रिंग को जैसा रखना है, इसे डेटटाइम & में कनवर्ट करना होगा, फिर AddHours &/या अपनी आवश्यकताओं के आधार पर डेटटाइम ऑब्जेक्ट में AddMinutes।

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; 
    } 
} 

लेकिन यह स्ट्रिंग प्रॉपर्टी के साथ ही काम करेंगे।

संबंधित मुद्दे