9

異なる言語のウェブサイトを作成したい。これは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); 

    } 
} 


私は英語とドイツ語の数値形式で作業するために、カスタムModelBinderを作成する必要がありました( 123,456,789.1123.456.789,1):私はすでに私が ActionFilterを作成することができることを読んで、私はリッテ問題を抱えていますModelBinderは、現在のカルチャを使用して、使用されるフォーマットを決定します。 しかし、残念ながら、ModelFinderは、ActionFilterがカルチャを変更する前に使用されます。

の前に文化を変更するにはModelBinderがアクティブになりますか?

答えて

7

hereのように、IHttpModuleを実装して、BeginRequestでカルチャを設定できます。

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

を設定することができ、モデルをバインドする前に実行されます、あなたに多くのことを感謝!しかし、私は1つの質問を持っています:あなたは知っています、なぜコードは要求ごとに5回実行されますか? – Christopher

+0

私はその動作を取得していません。 ((System.Web.HttpApplication)(送信者))にRequest.RawUrlに時計を追加して、リクエストが同じかどうか確認できますか? – barry

+2

@Christopherコードはリクエストごとに1回(したがってBeginRequestという名前で)実行されるため、ページのリクエストが1回、スタイルシート、画像、またはJavaScriptファイルのリクエストが4回あります。 Request.Urlをチェックしてください。 –

6

私は通常(バリーにより示唆されるように、あなたもIHttpModuleでこのイベントを処理できる)Global.asax.csPreRequestHandlerExecuteイベントを処理することにより、CurrentCultureCurrentUICultureを設定します。

モデル結合が行われる前に発生するイベントでこれを行うことがポイントです。あなたが利用できるこの前に行われるいくつかの他のイベントがあります。

利用可能なイベントと発生した順序については、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イベントを処理することによってそれを行うことができます。 IAuthorizationFilter

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

インスタンスは、このようにそれが働いているあなたが必要な文化

関連する問題