9

다른 언어로 웹 사이트를 만들고 싶습니다. 나는 이미 내가 ActionFilter를 만들 수 있다는 것을 읽을 수 있지만 나는 litte 문제가 :
내가 영어 및 독일어 숫자 형식 (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는 현재 문화권을 사용하여 어떤 형식이 사용되는지 결정합니다. 하지만 불행히도 ModelFinder는 ActionFilter가 문화를 바꿀 수 있기 전에 사용됩니다.

전에 ModelBinder가 활성화되기 전에 문화를 어떻게 바꿀 수 있습니까?

답변

7

here처럼 IHttpModule을 구현하고 BeginRequest에 culture를 설정할 수 있습니다.

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) (보낸 사람)에게 시계를 추가 할 수 있습니까? Request.RawUrl 및 요청이 동일한 지 확인하십시오? – barry

+2

@Christopher 코드는 요청 당 한 번 (따라서 BeginRequest라는 이름으로) 실행되므로 페이지에 대한 요청이 하나 있고 스타일 시트, 이미지 또는 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

인스턴스는, 모델 바인딩 전에 실행 따라서 당신이 필요한 문화

그것은 작동하고
관련 문제