0

カルチャ固有の値を正しくバインドできるようにするために、次の ModelBinder があります。

public class CultureAwareModelBinder : DefaultModelBinder {

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {

        BaseController controller = (BaseController)controllerContext.Controller;

        CultureInfo culture  = controller.Settings.Culture;
        CultureInfo language = controller.Settings.Language;

        Thread.CurrentThread.CurrentCulture   = culture;
        Thread.CurrentThread.CurrentUICulture = language;

        return base.BindModel(controllerContext, bindingContext);
    }
}

(現在のアプリケーションのユーザーのBaseController.Settings正しいを公開するプロパティです)。CultureInfo

私はそれをそのように設定しました

protected void Application_Start() {
    ModelBinders.Binders.DefaultBinder = new CultureAwareModelBinder();
}

コードをデバッグしてステップスルーすると、Thread.Culture は正しく設定されていますが、モデルは間違った値を取得し続けます。

これは私のモデルです:

public class EventModel {

    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

Web ブラウザのいずれかのフィールドに「10/6/2013」を指定して送信を押し、カルチャが「en-GB」の場合 (スレッドの DateTimeFormat が実際に に設定されていることを確認したdd/MM/yyyy場合)、MVC はそれを2013 年 6 月 10 日ではなく、2013 年 10 月 6 日です。

なぜこれが起こっているのかわかりません。残念ながら、実際のモデルバインディングにソースステップを踏むことはできません。スレッド文化を尊重しないのはなぜですか?

4

2 に答える 2

1

モデル バインダーに現在のカルチャを設定するには遅すぎます。これは、実行パイプラインのかなり早い段階で行う必要があります。たとえばApplication_BeginRequest、あなたのGlobal.asax.

于 2013-06-10T06:53:59.453 に答える