为了正确绑定特定于文化的值,我有这个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; }
}
当我在网络浏览器中为任一字段指定“10/6/2013”并点击提交时,以及当文化为“en-GB”时(我检查线程的DateTimeFormat确实设置为{{1}) }),MVC在2013年10月6日,而不是2013年6月10日收到它。
我不知道为什么会发生这种情况,遗憾的是我无法采取步骤进入实际的模型绑定。为什么不尊重线程文化?
答案 0 :(得分:1)
太晚在模型绑定器中设置当前文化。这应该在执行管道中更早地完成。例如,Application_BeginRequest
中的Global.asax
事件。
答案 1 :(得分:1)
我遇到了同样的问题。我的解决方案是使用DefaultModelBinder
而不是使用ActionFilter
来设置所需的文化我使用了IAuthorizationFilter
具有相同的效果,但是在模型绑定之前执行不像'ActionFilter '在模型绑定后执行。
我很欣赏它IAuthorizationFilter
使用{{1}}略显不雅或非正统使用。但它确实可以解决问题。