Я использовал глобальный ActionFilter
для этого, но недавно я понял, что установка текущей культуры в методе OnActionExecuting
в некоторых случаях слишком поздняя. Например, когда модель после запроса POST поступает в контроллер, ASP.NET MVC создает метаданные для модели. Это происходит до того, как какие-либо действия будут выполнены В результате значения атрибутов DisplayName
и другие аннотации данных обрабатываются с использованием культуры по умолчанию на этом этапе.
В конце концов я перенес установку текущей культуры в пользовательскую реализацию IControllerActivator
, и она работает как шарм. Я полагаю, что с точки зрения жизненного цикла запроса это почти то же самое, что разместить эту логику на фабрике пользовательских контроллеров, как у вас сегодня. Это гораздо надежнее, чем использование глобальных ActionFilter
.
CultureAwareControllerActivator.cs :
public class CultureAwareControllerActivator: IControllerActivator
{
public IController Create(RequestContext requestContext, Type controllerType)
{
//Get the {language} parameter in the RouteData
string language = requestContext.RouteData.Values["language"] == null ?
"tr" : requestContext.RouteData.Values["language"].ToString();
//Get the culture info of the language code
CultureInfo culture = CultureInfo.GetCultureInfo(language);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
return DependencyResolver.Current.GetService(controllerType) as IController;
}
}
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
...
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory(new CultureAwareControllerActivator()));
}
}