2011-06-17 14 views
5

में किसी विशिष्ट प्रारूप में दिनांक मान्य करें मेरे पास मेरे व्यूमोडेल में DateTime MyDate प्रकार की एक संपत्ति है। मुझे यकीन है कि उपयोगकर्ता केवल एक विशिष्ट प्रारूप (dd.mm.yyyy) में एक पाठ बॉक्स में दिनांक भाग में प्रवेश करती है बनाना चाहते और निम्न विशेषताओं की कोशिश की:एएसपी.नेट एमवीसी 3

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)] 
[RegularExpression(@"^(([0-2]\d|[3][0-1])\.([0]\d|[1][0-2])\.[2][0]\d{2})$", 
    ErrorMessage="Failed...")] 
public DateTime MyDate { get; set; } 

एक के लिए नियंत्रक कार्रवाई हस्ताक्षर HttpPost तरह लग रहा है इस:

  1. @Html.TextBoxFor(model => model.MyDate)

  2. :

    [HttpPost] 
    public ActionResult Edit(int id, MyViewModel viewModel) 
    { 
        // MyViewModel contains the MyDate property ... 
        // ... 
        if (ModelState.IsValid) 
        { 
         // ... 
        } 
        // ... 
    } 
    

    उस्तरा ध्यान में रखते हुए मैं निम्नलिखित दो तरीकों की कोशिश की

  3. @Html.EditorFor(model => model.MyDate)

के रूप में मैं चाहता हूँ यह काम नहीं करता। परिणाम है:

  • क्लाइंट साइड सत्यापन दोनों एचटीएमएल सहायकों
  • सर्वर साइड सत्यापन हमेशा दोनों सहायकों के लिए विफल रहता है के साथ की उम्मीद के रूप में काम करता है, यहाँ तक कि "2011/06/17" जो नियमित अभिव्यक्ति पारित की तरह वैध तिथियों के साथ। MyDate संपत्ति viewModel में दर्ज की गई तिथि के साथ सही ढंग से भर दी गई है जो क्रिया को पारित किया जाता है। तो ऐसा लगता है कि मॉडल बाध्यकारी काम कर रहा था।
  • DisplayFormat विशेषता केवल EditorFor द्वारा सम्मानित है लेकिन TextBoxFor द्वारा नहीं। TextBoxFor प्रदर्शित करता है "dd.mm.yyyy hh: mm: ss"

सवाल:

  1. मैं एक संपत्ति है जो एक string नहीं है पर सब पर एक RegularExpressionAttribute लागू कर सकते हैं? यदि यह अनुमति है कि गैर-स्ट्रिंग प्रॉपर्टी के लिए रीग एक्स का मूल्यांकन कैसे किया जाता है जैसे सर्वर पर DateTime? क्या रेग एक्स की तुलना में MyDate.ToString() की तरह कुछ है? (यह समझा जाएगा कि सत्यापन विफल हो जाता है क्योंकि ToString समय भाग जो नियमित अभिव्यक्ति पास नहीं सहित एक स्ट्रिंग वापस आ जाएगी।)

  2. DisplayFormat विशेषता आम तौर पर केवल TextBoxFor द्वारा EditorFor और कभी नहीं द्वारा सम्मानित है?

  3. मैं दिनांक सत्यापन सही कैसे कर सकता हूं?

उत्तर

4

अब मैंने RegularExpression को फेंक दिया है। यह DateTime प्रकार की संपत्ति पर उपयुक्त प्रतीत नहीं होता है।

[AttributeUsage(AttributeTargets.Property, Inherited = false, 
    AllowMultiple = false)] 
public sealed class DateOnlyAttribute : ValidationAttribute 
{ 
    public DateOnlyAttribute() : 
     base("\"{0}\" must be a date without time portion.") 
    { 
    } 

    public override bool IsValid(object value) 
    { 
     if (value != null) 
     { 
      if (value.GetType() == typeof(DateTime)) 
      { 
       DateTime dateTime = (DateTime)value; 
       return dateTime.TimeOfDay == TimeSpan.Zero; 
      } 
      else if (value.GetType() == typeof(Nullable<DateTime>)) 
      { 
       DateTime? dateTime = (DateTime?)value; 
       return !dateTime.HasValue 
        || dateTime.Value.TimeOfDay == TimeSpan.Zero; 
      } 
     } 
     return true; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(CultureInfo.CurrentCulture, 
      ErrorMessageString, name); 
    } 
} 

उपयोग::

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode=true)] 
[DateOnly] 
public DateTime MyDate { get; set; } 

यह ग्राहक साइड सत्यापन प्रदान नहीं करता है तो मैं दिनांक समय और नल दिनांक समय के लिए एक नया सत्यापन विशेषता बना। सर्वर पक्ष पर सत्यापन मॉडल बाध्यकारी पर निर्भर करता है (यह सुनिश्चित करने के लिए कि दर्ज स्ट्रिंग DateTime पर कनवर्ट करने योग्य है)। यदि उपयोगकर्ता मध्यरात्रि के अलावा अन्य समय में प्रवेश करता है तो DateOnly विशेषता में शामिल होता है और उसे चेतावनी मिलती है कि केवल एक तारीख दर्ज की जानी चाहिए।

10

तिथियों को सत्यापित करने के लिए नियमित अभिव्यक्तियों का उपयोग न करें, उन्हें केवल अनदेखा किया जाता है।

संस्कृतियों में अंतर आपकी समस्या का मूल हो सकता है। तिथि को सत्यापित करने के लिए ग्राहक पक्ष सत्यापन ब्राउज़र की संस्कृति का उपयोग करता है। तो उदाहरण के लिए यदि यह en-US पर कॉन्फ़िगर किया गया है तो अपेक्षित प्रारूप MM/dd/yyyy होगा। यदि आपका सर्वर fr-FR का उपयोग करने के लिए कॉन्फ़िगर किया गया है तो अपेक्षित प्रारूप dd/MM/yyyy होगा।

आप सर्वर साइड संस्कृति सेट करने के लिए web.config में <globalization> तत्व का उपयोग कर सकते हैं।आप इस तरह से है कि यह ग्राहक के रूप में एक ही संस्कृति का उपयोग करता है में कॉन्फ़िगर कर सकते हैं:

<globalization culture="auto" uiCulture="auto"/> 

Hanselman वैश्वीकरण और ASP.NET MVC में स्थानीयकरण के बारे में nice blog post है।

+0

लिंक के लिए धन्यवाद, मैंने इसे भविष्य के संदर्भ के लिए बुकमार्क किया है। लेकिन: मुझे नहीं लगता कि मेरी समस्या स्थानीयकरण के साथ कुछ भी करने के लिए है। मुझे विश्वास नहीं है कि नियमित अभिव्यक्ति को नजरअंदाज कर दिया जाता है: क्लाइंट साइड सत्यापन कार्य और सर्वर साइड सत्यापन भी reg ex के साथ कुछ करता है (यह इस नियम पूर्व के खिलाफ विफल रहता है, जैसा कि मॉडलस्टेट कहता है)। मैं एक देव मशीन (क्लाइंट और सर्वर = एक ही मशीन) पर परीक्षण करता हूं, इसलिए स्थानीय समान होते हैं। लेकिन मैं इस बीच भी विश्वास करता हूं कि एक पूर्व पूर्व का उपयोग गलत है (हालांकि अनदेखा नहीं किया गया है)। आप कैसे मान्य करेंगे कि उपयोगकर्ता केवल समय के बिना तारीख में प्रवेश करता है? – Slauma

+1

@ स्लुमा, तथ्य यह है कि आपने उसी मशीन पर यह कोशिश की है इसका मतलब यह नहीं है कि ब्राउज़र और सर्वर की संस्कृति सेटिंग्स में अंतर नहीं है। जहां तक ​​समय का हिस्सा चिंतित है, मैं बस उस उपयोगकर्ता को प्रारूप में बताऊंगा जिसकी उसे तारीख में प्रवेश करने की आवश्यकता है, और सर्वर पर मैं केवल समय के हिस्से को अनदेखा कर दूंगा यदि मेरे आवेदन की आवश्यकता नहीं है। शायद उपयोगकर्ता को सही प्रारूप में दर्ज करने वाले उपयोगकर्ता को सरल बनाने के लिए एक jquery date picker भी प्रदान करें। –

+0

आप सही हैं, मैं इसे बहुत जटिल कोशिश कर रहा हूं। अब उपयोगकर्ता इनपुट के लिए थोड़ी अतिरिक्त सहायता के रूप में मैंने 'डेटऑनली' विशेषता बनाई है (यहां मेरा अपना जवाब देखें)। तिथि पिकर उपयोगकर्ता के लिए एक बेहतर मदद है! मैं इसे अगले चरणों में से एक के रूप में कोशिश करूंगा। – Slauma

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