Как изменить формат данных для текущей культуры, чтобы он применялся ко всему веб-приложению

Я хотел бы установить формат даты «ГГГГ-ММ-ДД» для всего моего веб-приложения. Я могу сделать это, создав объект CultureAndRegionInfoBuilder и затем зарегистрировав его. Но поскольку мое приложение находится в размещенной среде, я не могу запускать исполняемые файлы для регистрации языка и региональных параметров.

Мне нужен способ сделать это в Application_Start, чтобы он применялся ко всему веб-приложению.

Я попытался изменить формат даты с помощью Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern, но, похоже, это не распространяется на все приложение.

Короче говоря, мне нужен способ программно изменить текущие настройки культуры всего веб-приложения из самого веб-приложения.

Редактировать: я попробовал следующее по предложению @doitgood, но получил исключение System.InvalidOperationException: Instance is read-only., в то время как intellisense показывает свойство как Get или Set.

void Application_BeginRequest(object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";   
}

Чтобы сделать изменение глобальным для приложения, я попробовал следующее в Application_Start:

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";

Я получаю то же исключение «Экземпляр доступен только для чтения».


person Pradeep    schedule 14.09.2011    source источник


Ответы (4)


Ответ Себето правильный. У меня была такая же проблема, и я только что попробовал. Я подумал, что добавлю еще несколько пояснений. Свойства текущего языка и региональных параметров действительно доступны только для чтения после установки текущего языка и региональных параметров. Поэтому вы должны создать новый объект CultureInfo (самый простой способ — клонировать существующую культуру). Затем вы можете настроить свойства информационного объекта культуры перед заменой текущего объекта культуры потоков на свой собственный.

CultureInfo newCultureDefinition = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
//make percentages n% instead of n % .ToString("p") adds a space by default english culture in asp.net
newCultureDefinition.NumberFormat.PercentPositivePattern = 1;
newCultureDefinition.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
Thread.CurrentThread.CurrentCulture = newCultureDefinition;

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

Согласно примеру Microsoft, см. http://support.microsoft.com/kb/306162, вы можете даже изменить текущую культуру на Page_Load. Поскольку у вас может быть код, требующий форматирования перед загрузкой Page_Load, я поместил свои изменения в свою базовую страницу OnInit.

protected override void OnInit(EventArgs e)
{
        initGlobalCulturalFormattingChanges();
}

и в завершение:

private void initGlobalCulturalFormattingChanges()
{

    CultureInfo newCultureDefinition = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
    //make percentages n% instead of n % (.ToString("p0") adds a space by default in asp.net
    newCultureDefinition.NumberFormat.PercentPositivePattern = 1;
    newCultureDefinition.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";
    Thread.CurrentThread.CurrentCulture = newCultureDefinition;

}

Это лучшая идея, чтобы поменять культуру текущего потока с каждым запросом на каждую страницу инициализации? У меня недостаточно данных, чтобы взвесить это, но, похоже, все работает нормально :).

person AdamE    schedule 10.09.2012

получил исключение «System.InvalidOperationException: экземпляр доступен только для чтения», в то время как intellisense показывает свойство как Get или Set.

Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern ="yyyy-MM-dd";

Вы не можете напрямую изменить вещи в Thread.CurrentThread.CurrentCulture, по-видимому, у меня та же проблема.

Но вы можете сделать это так:

CultureInfo TempCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
TempCulture.DateTimeFormat.ShortDatePattern ="yyyy-MM-dd";
Thread.CurrentThread.CurrentCulture = TempCulture;
person Sebeto    schedule 05.10.2011

Если вы сделаете это application_start, то будет задействован только поток, запустивший приложение.

Вы должны убедиться, что изменение происходит при каждом запросе - HttpModule, который устанавливает это для каждого запроса, вероятно, является самым чистым решением.

person Oded    schedule 14.09.2011

Не могли бы вы поместить свой код в событие global.asax Application_BeginRequest и обновить соответствующие Thread.CurrentThread.CurrentUICulture и Thread.CurrentThread.CurrentCulture?

person Benoit Drapeau    schedule 14.09.2011