【发布时间】:2012-01-03 19:40:29
【问题描述】:
对于多语言 ASP.NET MVC 3 Web 应用程序,我在控制器工厂中确定 Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture 如下:
public class MyControllerFactory : DefaultControllerFactory {
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) {
//Get the {language} parameter in the RouteData
string UILanguage;
if (requestContext.RouteData.Values["language"] == null)
UILanguage = "tr";
else
UILanguage = requestContext.RouteData.Values["language"].ToString();
//Get the culture info of the language code
CultureInfo culture = CultureInfo.CreateSpecificCulture(UILanguage);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
return base.GetControllerInstance(requestContext, controllerType);
}
}
上面的代码已经快一年了!所以,我愿意接受建议。
我在 Global.asax 文件中注册了这个,例如:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
这很好用,但我不确定这是否是执行此类操作的最佳做法和最佳位置。
ControllerFactory 的主要角色我没有深入研究,无法与ActionFilterAttribute 进行比较。
您认为进行此类操作的最佳地点是什么?
【问题讨论】:
-
我还没有找到改变 CurrentCulture 的充分理由。虽然它使日期和时间格式自动工作,但我认为仅仅为此改变文化是过度的(例如,在打开与使用文化 Y 的服务器的 SQL 连接时,您是否希望线程文化为 X?我宁愿离开 CurrentCulture当我需要格式化日期和数字时,单独使用用户文化。(不过,CurrentUICulture 在我看来是可以的。)
-
@HectorCorrea 谢谢赫克托。实际上我从来没有想过这一点,最好的部分是你是对的。我只为资源文件更改它。你认为 CurrentUICulture 就足够了吗?
-
是的,CurrentUICulture 对于资源来说已经足够了。 [有趣的是,今年早些时候我在将文化切换到土耳其语时使用 CurrentCulture 被咬了,因为大写“I”和小写“i”的问题。与此链接中描述的非常相似。我想知道您对此有何看法,因为您似乎在处理土耳其语。 west-wind.com/weblog/posts/2005/May/23/…]
-
不,它适用于 UICulture。
-
我知道这是旧的,但我不得不不同意。 CurrentCulture 是用来操纵的。需要明确设置的是对数据库等的写入(例如,使用 InvariantCulture)。这就是依赖 CurrentCulture 会给您带来麻烦的地方。
标签: asp.net-mvc asp.net-mvc-3 action-filter controller-factory