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

时间:2011-08-26 09:22:46

标签: c# asp.net-mvc asp.net-mvc-3 globalization

目前,我有一个名为GlobalizationFilter的全局过滤器,用于检查路由值,Cookie和浏览器语言标头,以确定请求的正确文化设置:

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

一切正常,但模型绑定过程似乎发生在全局过滤器之前,因此模型绑定器不会考虑文化设置。

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

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

  • 应用程序的BeginRequest事件。此时路由尚未发生,因此我将不得不手动从URL中删除/en-US/文化令牌。这是不可接受的。

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

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

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

提前感谢任何贡献。

1 个答案:

答案 0 :(得分:15)

将确定文化的代码解压缩到单独的组件/类中。然后创建一个ModelBinder,该DefaultModelBinder派生自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();

{{1}}