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

当我在我的网络浏览器中为任一字段指定“10/6/2013”​​并点击提交时,并且当文化为“en-GB”时(并且我检查了线程的 DateTimeFormat 确实设置为dd/MM/yyyy),MVC 将其接收为2013 年 10 月 6 日,而不是 2013 年 6 月 10 日。

我不知道为什么会这样,不幸的是我无法直接进入实际的模型绑定。为什么不尊重线程文化?

4

2 回答 2

1

在模型活页夹中设置当前区域性为时已晚。这应该在执行管道的早期完成。例如在Application_BeginRequest您的事件中Global.asax

于 2013-06-10T06:53:59.453 回答
1

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

我很欣赏它的使用有点不雅/不正统,IAuthorizationFilter但它确实起到了作用。

于 2013-06-20T08:33:33.597 回答