9

Chcę utworzyć witrynę internetową w różnych językach. Już odczytać, że mogę stworzyć ActionFilter, ale mam Litte problem:
musiałem utworzyć niestandardową ModelBinder w celu pracy z angielskim i niemieckim formatów numerycznych (123,456,789.1 vs. 123.456.789,1)Zmień kulturę przed skorzystaniem z aplikacji ModelBinder.

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); 

    } 
} 

ten ModelBinder używa aktualnej kultury, aby zdecydować, który format jest używany. Niestety aplikacja ModelBinder jest używana, zanim ActionFilter może zmienić kulturę.

Jak zmienić kulturę przed modelBinder staje się aktywny?

Odpowiedz

7

Możesz zaimplementować moduł IHttpModule i ustawić kulturę w BeginRequest, jak widać 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

To działa, dziękuję bardzo! Ale mam jedno pytanie: czy wiesz, dlaczego kod jest wykonywany 5 razy na żądanie? – Christopher

+0

Nie dostaję tego zachowania. Czy możesz dodać zegarek do ((System.Web.HttpApplication) (nadawca)). Request.RawUrl i sprawdzić, czy żądania są takie same? – barry

+2

@Christopher Kod jest wykonywany raz na żądanie (stąd nazwa BeginRequest), więc być może istnieje jedno żądanie strony, a kolejne 4 dla arkuszy stylów, obrazów lub plików JavaScript. Sprawdź Request.Url, który może rzucić trochę światła. –

6

I zazwyczaj ustawić CurrentCulture i CurrentUICulture obsługując zdarzenie PreRequestHandlerExecute w Global.asax.cs (można również obsługiwać to wydarzenie w IHttpModule sugerowane przez Barry).

Chodzi o to, aby zrobić to w zdarzeniu, które ma miejsce, zanim nastąpi wiązanie modelu. Istnieje kilka innych zdarzeń, które mają miejsce przed tym, który można wykorzystać.

Spójrz na numer HttpApplication Class, aby uzyskać informacje o dostępnych wydarzeniach i kolejności ich podnoszenia.

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; 
     } 
    } 

Można też to zrobić przez obsługę zdarzenia OnActionExecuting na swój Controller (prawdopodobnie chcesz stworzyć podstawowy kontroler i zrobić tam, wtedy wszystkie kontrolery dziedziczyć z tego sterownika bazowego).

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 jest wywoływane PO wywołaniu bindera modelu. Tak więc OnActionExecuting jest za późno. – Rookian

4

Przypadki IAuthorizationFilter zostanie wykonany przed modelu wiązania, dzięki czemu można ustawić potrzebne kultur