2013-07-17 3 views
6

यह पता चला है कि एमवीसी के DefaultModelBinder मूल्य बनाम मूल्यों के लिए अलग-अलग संस्कृतियों का उपयोग करते हैं (उदा। double, DateTime, आदि) POST बनाम जीईटी अनुरोधों के लिए। Here अधिक जानकारी है।किसी दिए गए मान पर बाध्यकारी मॉडल में उपयोग किए गए सभी ValueProviderResult की संस्कृति को कैसे सेट करें?

मुझे लगता है कि यह CultureValueProviderResult वस्तुओं की संपत्ति द्वारा नियंत्रित है, जो IValueProvider.GetValue() से लौटाए गए हैं।

मेरा प्रश्न है: मैं वैश्विक स्तर पर यह कैसे सुनिश्चित कर सकता हूं कि यह मान हमेशा CultureInfo.InvariantCulture है।

मुझे पता है कि मैं कस्टम मूल्य प्रदाताओं को कार्यान्वित कर सकता हूं और इसे इस तरह से कर सकता हूं।

मुझे पता है कि मैं कस्टम मॉडल बाइंडर्स को कार्यान्वित कर सकता हूं और इसे इस तरह से कर सकता हूं।

मुझे पता है कि मैं धागे में संस्कृति स्थापित कर सकता हूं, लेकिन दुर्भाग्य से यह मेरे मामले में एक विकल्प नहीं है।

जो मैं खोज रहा हूं वह इसे सेट करने का एक तरीका है ताकि डिफ़ॉल्ट मॉडल बाइंडर और मौजूदा मूल्य प्रदाता संस्कृति परिवर्तनीय तरीके से विश्लेषण कर सकें, भले ही थ्रेड संस्कृति सेट हो।

उत्तर

4

जहाँ तक मुझे पता है, आपके मानदंडों से मेल खाने का कोई तरीका नहीं है। आप को उन चीज़ों में से एक करना होगा जो आप जानते हैं कि आप कर सकते हैं (मैं कहूंगा कि सबसे उचित तरीका कस्टम मूल्य प्रदाता होगा)।

कारण: सभी डिफ़ॉल्ट ValueProviders CultureInfo.InvariantCulture या CultureInfo.CurrentCulture का उपयोग करने के लिए हार्डकोड किए गए हैं।

यहाँ, विशेष रूप से, जिस तरह से FormValueProvider यह करता है:

internal FormValueProvider(
      ControllerContext controllerContext, 
      IUnvalidatedRequestValues unvalidatedValues 
     ) 
     : base(
       controllerContext.HttpContext.Request.Form, 
       unvalidatedValues.Form, 
       CultureInfo.CurrentCulture // <--- Grrr, argh 
     ) 
{ 
} 

संस्कृति कहीं और (से प्राप्त नहीं होता यानी, तर्क के ऊपर एक डिफ़ॉल्ट के रूप में इस्तेमाल नहीं किया है, लेकिन एक संस्कृति के रूप में उपयोग करने के लिए)।

अलग IValueProviders

संदर्भ के लिए की संस्कृति, तब ये डिफ़ॉल्ट IValueProviders से प्रत्येक के लिए संस्कृतियों हैं:

  • ChildActionValueProvider: InvariantCulture
  • FormValueProvider: CurrentCulture
  • JsonValueProvider : वर्तमान संस्कृति
  • RouteDataValueProvider: InvariantCulture
  • QueryStringValueProvider: InvariantCulture
  • HttpFileCollectionValueProvider: InvariantCulture

की जगह CurrentCulture IValueProviders

यह एक बड़ी कार्य FormValueProvider को बदलने के लिए, क्योंकि के रूप में देखा नहीं है ऊपर, यह सिर्फ अपनी बेस क्लास '(NameValueCollectionValueProvider) कन्स्ट्रक्टर कहता है - जो वांछित संस्कृति लेता है एक तर्क के रूप में।

फॉर्मवैल्यूप्रोवाइडर का मूल कार्यान्वयन सतह पर दिखाई देता है जो आंतरिक वर्गों और इंटरफेस के संदर्भ में वास्तव में कठिन होता है। लेकिन प्रदाता को प्रतिस्थापित करने के लिए उनकी आवश्यकता नहीं है - वे केवल यूनिट परीक्षण के लिए हैं। Request.Forms और Validation.Unvalidated(Request) की Forms संपत्ति (एक स्थिर विधि):

आप केवल दो NameValueCollection कि आसानी से प्राप्त कर रहे हैं गुजर, (जैसा कि ऊपर उल्लेख) आधार निर्माता कॉल करने के लिए की जरूरत है। और अपनी इच्छित संस्कृति के लिए तीसरा तर्क निर्धारित करें।

FormValueProviderFactory और भी सरल है।

JsonValueProvider थोड़ा और अधिक शामिल है - क्योंकि हालांकि यह अधिभावी GetValueProvider() अनुमति देता है, उस विधि में मुख्य रूप से अन्य private static तरीकों के लिए कॉल के होते हैं - मूल रूप से आप एक नया वर्ग के लिए JsonValueProviderFactory के स्रोत को कॉपी करें और संशोधित करने के लिए होगा।

संपादित करें (पेटार इवानोव): यह मेरे लिए काम करता है। इसे काम करने के लिए कस्टम फैक्टरी को ValueProviderFactories.Factories पर जोड़ने के लिए पर्याप्त नहीं था, क्योंकि इस तरह इसे FormValueProviderFactory के बाद जोड़ा गया है। इसके बजाय, मुझे कस्टम के साथ FormValueProviderFactory को प्रतिस्थापित करना पड़ा।

+0

उत्तर के लिए धन्यवाद। मुझे लगता है कि मुझे यकीन नहीं था कि कौन से डिफ़ॉल्ट प्रदाता वर्तमान संस्कृति का उपयोग करते हैं (और इसलिए मुझे विस्तार करने की आवश्यकता है), इसलिए मैं एक और सामान्य समाधान की तलाश में था। –

+0

सूची जोड़ा गया। मैंने 'सत्र' और 'टेम्पडडाटा' हटा दिया - वे एमवीसी फ्यूचर्स का हिस्सा हैं और इसलिए डिफ़ॉल्ट रूप से इसका उपयोग नहीं किया जाता है - वही 'कुकी' और 'सर्वर वैरिएबल' के लिए जाता है। वे सभी 'InvariantCulture' का उपयोग करते हैं। – JimmiTh

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