2012-03-22 23 views
8

में बाध्यकारी एन-जीबी तिथियां मुझे तिथियों के साथ एक समय का दुःस्वप्न है। यूके में आधारित थे, इसलिए हमारी तिथि प्रारूप डीडी/एमएम/yyyy है। जब उपयोगकर्ता एक निश्चित तारीख चाहते हैं तो उपयोगकर्ता फॉर्म में टाइप करेंगे। मेरे पास एक ऐसा फॉर्म है जो ऐसी संपत्ति स्वीकार करता है। यह स्पष्ट रूप से डेटटाइम प्रकार है। मैं इस फॉर्म को जीईटी में नियंत्रक को भेजना चाहता हूं, इसलिए उपयोगकर्ता के पास एक अच्छा यूआरएल है जो वे पास को सहेज सकते हैं आदि। दृश्य को इस तत्व के लिए एक JQuery UI डेटपिकर को भी बांधना होगा। मैं भी ऐसा फ़ॉर्म तत्व की जरूरत है ताकि मैं वास्तव में इस प्रकार के फार्म को यह रेंडर करने के लिए की जरूरत है एक निश्चित आईडी और वर्ग के लिए:HTTP GET

<globalization uiCulture="en" culture="en-GB"/> 
:

@Html.TextBoxFor(model => model.ReturnDate, new { Class = "date", id = "ReturnDate" }) 

मैं web.config में ब्रिटेन के एक संस्कृति संस्करण निर्दिष्ट किया है

हालांकि यह समझाया गया है, जैसा कि यहां बताया गया है (http://weblogs.asp.net/melvynharbour/archive/2008/11/21/mvc-modelbinder-and-localization.aspx) कि जब एक नियंत्रक एक्ट्यूशन प्राप्त करता है कि एमवीसी संस्कृति संस्करण को अनदेखा करता है और अमेरिका को डिफ़ॉल्ट करता है (जाहिर है कि अमेरिका के बाहर कोई भी मौजूद नहीं है तो यह माइक्रोसॉफ्ट के लिए ठीक है, रेंट ओवर) संलग्न मदद नहीं करता है क्योंकि इसका मतलब है कि मुझे इसे प्रत्येक मॉडल में प्रत्येक तारीख के लिए सेट करना होगा!

इसका मतलब है कि यदि कोई उपयोगकर्ता 01/05/2012 टाइप करता है तो मैं 05/01/2012 के साथ समाप्त होता हूं जो गलत है!

मैंने इस मुद्दे के विभिन्न समाधानों को देखा है लेकिन मुझे वास्तव में जो भी चाहिए वह वास्तव में फिट नहीं है। मुझे एक तरीका चाहिए ताकि जीईटी के माध्यम से भेजी गई सभी तिथियां यूके प्रारूप में हैं। हम पूरी तरह से ब्रिटेन में स्थित हैं, इसलिए कोई भी यूके प्रारूप दर्ज नहीं किया जाएगा।

मैं वास्तव में बनाना और संपादक बनाना नहीं चाहता हूं जब तक कि यह एक तरीका नहीं है कि मैं इस संपादक से जुड़े व्यू/व्यूमोडेल के बिना ऐसा कर सकता हूं क्योंकि यह हर जगह इसका उपयोग करने के लिए अनावश्यक रूप से आ जाएगा, हमारे पास डेट पिकर है।

सभी मदद की सराहना की जाएगी!

public class GBDateModelBinder : IModelBinder 
{ 

    #region IModelBinder Members 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     string dateString = controllerContext.HttpContext.Request.QueryString[bindingContext.ModelName]; 
     if (string.IsNullOrEmpty(dateString)) 
       dateString = controllerContext.HttpContext.Request.Form[bindingContext.ModelName]; 
     DateTime dt = new DateTime(); 
     bool success = DateTime.TryParse(dateString, CultureInfo.GetCultureInfo("en-GB"), DateTimeStyles.None, out dt); 
     if (success) 
     { 
      return dt; 
     } 
     else 
      { 
      return null; 
     } 
    } 

    #endregion 
} 

तो Global.asax में रजिस्टर:

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder()); 

अद्यतन

इस बदल के लिए अनुमति देने के लिए

+0

आपकी पोस्ट को हल करने के लिए आपने जिस पोस्ट को लिंक किया है, वह कैसा है? – Jon

+0

जहाँ तक मैं देख सकता हूं मुझे प्रत्येक क्वेरीस्ट्रिंग पैरामीटर के लिए ऐसा करने की आवश्यकता होगी? (bindingContext.HttpContext.Request.QueryString ["thedate"];) यह व्यावहारिक नहीं है। – Liam

+1

यदि आप कस्टम मॉडल बाइंडर को कार्यान्वित करते हैं, तो यह प्रभावित होगा कि पूरे ऐप में आपके ऐप में कितनी तारीखें आती हैं, क्वेरीस्ट्रिंग्स, फॉर्म डेटा, कुकीज़ इत्यादि – Jon

उत्तर

10

संकेत के लिए एक समाधान है, धन्यवाद @Jon को समझे पोस्ट करते समय एक ही मुद्दा!

+0

मैं इस जीबीडेट मॉडलेलिंडर कहां रखूं: IModelBinder क्लास? – KayGee

+0

इससे कोई फर्क नहीं पड़ता? यह एक वर्ग है। जब तक आप इसे ग्लोबल्स में एक्सेस कर सकते हैं .asax इसे पंजीकृत करने के लिए जहां आप इसे डालते हैं, यह आपके ऊपर है। – Liam

2

लियाम के जवाब के अलावा: (!):

जो लोग अभी भी समस्या आ रही है और एक Nullable दिनांक समय के लिए बाध्य करने के लिए कोशिश कर रहे हैं के लिए, सुनिश्चित करें कि आप Global.asax में सही प्रकार रजिस्टर करना

ModelBinders.Binders.Add(typeof(DateTime), new GBDateModelBinder()); 
ModelBinders.Binders.Add(typeof(DateTime?), new GBDateModelBinder()); 

क्या मुझे 15 मिनट तक स्टंप किया गया था!

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