11

さまざまな言語でウェブサイトを作成したいと考えています。ActionFilterを作成できることは既に読みましたが、ちょっとした問題があります。英語とドイツ語の数値形式 ( vs. )
を操作するには、カスタム ModelBinder を作成する必要がありました。123,456,789.1123.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);

    }
}

この ModelBinder は、現在のカルチャを使用して、使用する形式を決定します。しかし残念なことに、ModelBinder は ActionFilter がカルチャを変更する前に使用されます。

ModelBinder がアクティブになるにカルチャを変更するにはどうすればよいですか?

4

3 に答える 3

7

私は通常、イベントを処理することでCurrentCultureandを設定します (barry が提案するように、このイベントを で処理することもできます)。CurrentUICulturePreRequestHandlerExecuteGlobal.asax.csIHttpModule

ポイントは、モデル バインディングが発生する前に発生するイベントでこれを行うことです。このイベントの前に、利用できるイベントが他にもいくつかあります。

使用可能なイベントと発生する順序については、HttpApplication クラスを参照してください。

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

OnActionExecutingでイベントを処理することによっても実行できますController(おそらく、ベース コントローラーを作成してそこで実行し、すべてのコントローラーがこのベース コントローラーから継承されるようにする必要があります)。

    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();
        }
    }
于 2012-11-21T14:20:04.883 に答える
7

ここに示すように、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;
    }
}
于 2012-11-18T22:40:55.663 に答える
4

モデル バインディングの前に get のインスタンスがIAuthorizationFilter実行されるため、必要なカルチャを設定できます。

于 2015-01-15T15:48:23.827 に答える