Thread.Culture在MVC2中不受模型绑定的尊重

时间:2013-06-10 06:48:28

标签: asp.net-mvc model-binding culture

为了正确绑定特定于文化的值,我有这个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日收到它。

我不知道为什么会发生这种情况,遗憾的是我无法采取步骤进入实际的模型绑定。为什么不尊重线程文化?

2 个答案:

答案 0 :(得分:1)

太晚在模型绑定器中设置当前文化。这应该在执行管道中更早地完成。例如,Application_BeginRequest中的Global.asax事件。

答案 1 :(得分:1)

我遇到了同样的问题。我的解决方案是使用DefaultModelBinder而不是使用ActionFilter来设置所需的文化我使用了IAuthorizationFilter具有相同的效果,但是在模型绑定之前执行不像'ActionFilter '在模型绑定后执行。

我很欣赏它IAuthorizationFilter使用{{1}}略显不雅或非正统使用。但它确实可以解决问题。