9

मैं विभिन्न भाषाओं में एक वेबसाइट बनाना चाहता हूं। मैं पहले से ही पढ़ा है कि मैं एक ActionFilter बना सकते हैं, लेकिन मैं एक litte समस्या है:
मैं आपको एक कस्टम ModelBinder बनाने के लिए अंग्रेजी और जर्मन संख्या प्रारूपों (123,456,789.1 बनाम 123.456.789,1)मॉडलबिंडर का उपयोग करने से पहले संस्कृति बदलें

public class DecimalModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     string key = bindingContext.ModelName; 
     var v = ((string[])bindingContext.ValueProvider.GetValue(key).RawValue)[0]; 
     float outPut; 
     if (float.TryParse(v, NumberStyles.Number, System.Globalization.CultureInfo.CurrentCulture, out outPut)) 
      return outPut; 
     return base.BindModel(controllerContext, bindingContext); 

    } 
} 

इस के साथ काम करने के लिए किया था मॉडलबिन्डर वर्तमान संस्कृति का उपयोग यह तय करने के लिए करता है कि किस प्रारूप का उपयोग किया जाता है। लेकिन दुर्भाग्यवश, एक्शनफिल्टर संस्कृति को बदलने से पहले मॉडलबिंडर का उपयोग किया जाता है।

मैं संस्कृति से पहले कैसे बदल सकता हूं मॉडलबिंडर सक्रिय हो जाता है?

उत्तर

7

आप एक IHttpModule लागू कर सकते हैं और BeginRequest में संस्कृति सेट कर सकते हैं, जैसा कि here देखा गया है।

void context_BeginRequest(object sender, EventArgs e) 
{ 
    // eat the cookie (if any) and set the culture 
    if (HttpContext.Current.Request.Cookies["lang"] != null) 
    { 
     HttpCookie cookie = HttpContext.Current.Request.Cookies["lang"]; 
     string lang = cookie.Value; 
     var culture = new System.Globalization.CultureInfo(lang); 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 
    } 
} 
+0

यह काम कर रहा है स्थापित करने के लिए अनुमति देता है, आप एक बहुत धन्यवाद! लेकिन मेरे पास एक सवाल है: क्या आप जानते हैं, कोड प्रति अनुरोध 5 बार क्यों निष्पादित किया जाता है? – Christopher

+0

मुझे वह व्यवहार नहीं मिल रहा है। क्या आप ((System.Web.HttpAplication) (प्रेषक)) पर एक घड़ी जोड़ सकते हैं। Request.RawUrl और देखें कि अनुरोध समान हैं या नहीं? – barry

+2

@ क्रिस्टोफर कोड प्रति अनुरोध एक बार निष्पादित किया जाता है (इसलिए नाम BeginRequest) तो शायद पृष्ठ के लिए एक अनुरोध है, और स्टाइलशीट, छवियों या जावास्क्रिप्ट फ़ाइलों के लिए 4 और अधिक है। Request.Url जांचें, जो कुछ प्रकाश डाल सकता है। –

6

मैं आमतौर पर (आप भी रूप में बैरी द्वारा सुझाए गए IHttpModule में इस घटना को संभाल सकता) Global.asax.cs में PreRequestHandlerExecute घटना से निपटने के द्वारा CurrentCulture और CurrentUICulture निर्धारित किया है।

बिंदु यह है कि मॉडल बाध्यकारी होने से पहले होने वाली घटना में ऐसा करना है। ऐसी कई अन्य घटनाएं हैं जो इस से पहले होती हैं जिनका आप उपयोग कर सकते हैं।

उपलब्ध घटनाओं के बारे में जानकारी के लिए HttpApplication Class पर देखें, और जिस क्रम में वे उठाए गए हैं।

public class MvcApplication : HttpApplication 
    { 
     protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) 
     { 
      var culture = new CultureInfo("en-GB"); // Get the culture name from the route values/request querystring/form/cookie 
      Thread.CurrentThread.CurrentCulture = culture; 
      Thread.CurrentThread.CurrentUICulture = culture; 
     } 
    } 

आप इसे अपने Controller पर OnActionExecuting घटना से निपटने के द्वारा भी कर सकता है (आप शायद एक आधार नियंत्रक बनाना चाहते हैं और वहाँ यह करते हैं, तो आपके सभी नियंत्रकों इस आधार नियंत्रक से विरासत है)।

public class MyBaseController : Controller 
    { 
     protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var culture = new CultureInfo("en-GB"); // Get the culture name from the route values/request querystring/form/cookie 
      Thread.CurrentThread.CurrentCulture = culture; 
      Thread.CurrentThread.CurrentUICulture = culture; 

      base.OnActionExecuting(filterContext); 
     } 
    } 

    public class MyController : MyBaseController 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 
    } 
+12

-1: मॉडल बाइंडर लागू होने के बाद OnActionExecuting का आह्वान किया जाता है। तो OnActionExecuting बहुत देर हो चुकी है। – Rookian

4

IAuthorizationFilter के उदाहरण मॉडल बंधन से पहले निष्पादित हो इस प्रकार आप की जरूरत संस्कृतियों

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