9

我想用不同的語言創建網站。我已經讀過,我可以創造一個ActionFilter,但我有一個豆蔻問題:
我不得不爲了創建一個自定義模型綁定器與英語和德語數字格式(123,456,789.1123.456.789,1在使用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使用當前的文化來決定使用哪種格式。 但是不幸的是,ModelBinder在ActionFilter可以改變文化之前使用。

如何在ModelBinder變爲活動狀態之前更改的文化

回答

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.HttpApplication)(sender))。Request.RawUrl並查看請求是否相同? – barry

+2

@Christopher該代碼每個請求執行一次(因此名稱爲BeginRequest),因此可能有一個頁面請求,還有4個樣式表,圖像或JavaScript文件。檢查Request.Url,這可能會有所幫助。 –

6

我通常在Global.asax.cs處理PreRequestHandlerExecute事件(你也可以在IHttpModule處理此事件由巴里的建議)設置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

實例模型綁定之前得到執行,從而使您可以設置所需要的文化

相關問題