2011-08-26 5 views
14

वर्तमान में, मेरे पास GlobalizationFilter नामक एक वैश्विक फ़िल्टर है जो अनुरोध के लिए सही संस्कृति सेटिंग्स निर्धारित करने के लिए मार्ग मान, कुकीज़ और ब्राउज़र भाषा शीर्षलेख की जांच करता है:एमवीसी 3 वैश्वीकरण: मॉडल बाध्यकारी से पहले वैश्विक फ़िल्टर की आवश्यकता है

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    // determine cultureInfo 
    Thread.CurrentThread.CurrentCulture = cultureInfo; 
    Thread.CurrentThread.CurrentUICulture = cultureInfo; 
} 

यह सब काम करता है, लेकिन मॉडल बाध्यकारी प्रक्रिया प्रतीत होती है वैश्विक फ़िल्टर से पहले, और इसलिए मॉडल बाइंडर संस्कृति सेटिंग्स को ध्यान में नहीं लेता है।

इससे डबल मानों, DateTime मान आदि को समझने में समस्याएं आती हैं

मैं संस्कृति पहचान कोड को अन्य स्थानों पर ले जा सकता हूं, लेकिन मुझे अपने किसी भी विकल्प को पसंद नहीं है:

  • आवेदन की BeginRequest घटना। इस समय रूटिंग नहीं हुई है, इसलिए मुझे URL से /en-US/ संस्कृति टोकन मैन्युअल रूप से बाहर करना होगा। यह अस्वीकार्य में है।

  • नियंत्रक की Initialize() विधि। यह मुझे मेरे सभी नियंत्रकों के लिए बेस क्लास लिखने के लिए मजबूर करेगा, और इससे मौजूदा नियंत्रकों का वारिस होगा। मुझे यह पसंद नहीं है, लेकिन अगर मैं कुछ भी बेहतर नहीं होता तो मैं इस समाधान का चयन करूंगा।

आदर्श रूप में, मैं "रूटिंग पूर्ण" और "मॉडल बाध्यकारी शुरूआत" घटनाओं के बीच अपना कोड इंजेक्ट करने का कोई तरीका ढूंढना चाहता हूं, लेकिन मुझे इस पर एमएसडीएन/Google में कुछ भी नहीं मिला।

या शायद एमवीसी 3 वैश्वीकरण को संभालने का कोई और तरीका है जिसे मैं अनजान हूं?

किसी भी योगदान के लिए अग्रिम धन्यवाद।

उत्तर

15

उस कोड को निकालें जो संस्कृति को एक अलग घटक/वर्ग में निर्धारित करता है। फिर एक ModelBinder कि बुला BindModel

public class CultureAwareModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     /* code that determines the culture */ 
     var cultureInfo = CultureHelper.GetCulture(controllerContext.HttpContext); 

     //set current thread culture 
     Thread.CurrentThread.CurrentCulture = cultureInfo; 
     Thread.CurrentThread.CurrentUICulture = cultureInfo; 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

और उसके बाद आवेदन के लिए यह रजिस्टर (Application_Start में)

// register our own model binder as the default 
ModelBinders.Binders.DefaultBinder = new CultureAwareModelBinder(); 
+0

के बाद से मैं पाने के लिए जा रहा हूँ से पहले DefaultModelBinder संस्कृति स्थापित करने के लिए वर्ग का उपयोग करता है से निकला बनाने वैसे भी एक कस्टम मॉडल बांधने की मशीन, यह सबसे अच्छा तरीका लगता है। धन्यवाद – Zruty

+0

हालांकि, मॉडल बाइंडर में अनुरोध-व्यापी संस्कृति को सेट करना थोड़ा सा अंतर्ज्ञानी लगता है .. – Zruty

+0

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

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