カルチャ固有の値を正しくバインドできるようにするために、次の 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 日です。
なぜこれが起こっているのかわかりません。残念ながら、実際のモデルバインディングにソースステップを踏むことはできません。スレッド文化を尊重しないのはなぜですか?