目前,我有一个名为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全球化?
提前感谢任何贡献。
答案 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}}