MVC 3 установить текущий инвариант культуры

Я пытаюсь установить текущую культуру в инвариант

Сделано это в моем web.config

 <globalization uiCulture="" culture="" />

Добавил это в мой Application_Start()

System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

Но когда я вызываю метод на моем контроллере, Thread.CurrentThread.CurrentCulture устанавливается на da-DK

как это может быть?

3 ответа

Решение

Вам нужно установить CurrentCulture а также CurrentUICulture в теме запроса. Это можно сделать, переопределив OnActionExecuted или же OnActionExecuting методы либо в контроллере, либо в применяемом фильтре действий:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
    System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
}

Обновление: если вы хотите обработать сценарии привязки модели, вы должны отказаться от фильтра действий:

public void Application_OnBeginRequest(object sender, EventArgs e)
{
    var culture = GetCulture();
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
}

Вы устанавливаете культуру в текущем потоке только после запуска приложения. Но пользовательский запрос может быть обработан другим потоком.

Поэтому решение состоит в том, чтобы в начале каждого запроса вы устанавливали правильную культуру в этом потоке.

В MVC 3 вы можете сделать это, установив правильную культуру в вашем контроллере OnActionExecuting() метод.

Как описано в этом вопросе, вам нужно использовать application_beginrequest, если вы хотите, чтобы это оказало какое-либо влияние на связыватель модели.

Подбор моделей выполняется до вызова действия контроллера, потому что они создают значения, которые передаются в действие контроллера

Другие вопросы по тегам