MVC3全球化:在模型绑定之前需要全局过滤

目前,我有一个名为GlobalizationFilter的全局filter,它检查路由值,cookie和浏览器语言标题,以确定请求的正确文化设置:

 public override void OnActionExecuting(ActionExecutingContext filterContext) { // determine cultureInfo Thread.CurrentThread.CurrentCulture = cultureInfo; Thread.CurrentThread.CurrentUICulture = cultureInfo; } 

这一切都有效,但模型绑定过程似乎发生在全局filter之前,因此模型绑定器不会考虑文化设置。

这会导致解释双值, DateTime值等问题。

我可以将文化检测代码移动到其他位置,但我不喜欢我的任何选择:

  • 应用程序的BeginRequest事件。 此时路由尚未发生,因此我将不得不从URL手动取出/en-US/ culture标记。 这是不可接受的。

  • Controller的Initialize()方法。 这将迫使我为所有控制器编写基类,并从中inheritance现有的控制器。 我不喜欢这个,但如果没有更好的结果,我会选择这个解决方案。

理想情况下,我想找到一些方法在“路由完成”和“模型绑定开始”事件之间注入我的代码,但我在MSDN / Google上没有发现任何内容。

或者也许还有其他方法来处理我不知道的MVC3全球化?

在此先感谢任何贡献。

将确定文化的代码解压缩到单独的组件/类中。 然后创建一个从DefaultModelBinder派生的ModelBinder ,它使用该类在调用BindModel之前设置文化

 public class CultureAwareModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { /* code that determines the culture */ var cultureInfo = CultureHelper.GetCulture(controllerContext.HttpContext); //set current thread culture Thread.CurrentThread.CurrentCulture = cultureInfo; Thread.CurrentThread.CurrentUICulture = cultureInfo; return base.BindModel(controllerContext, bindingContext); } } 

然后为应用程序注册它(在Application_Start

 // register our own model binder as the default ModelBinders.Binders.DefaultBinder = new CultureAwareModelBinder();