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

Я хотел бы установить формат даты ' ГГГГ-ММ-ДД ' для всего моего веб-приложения.Я могу сделать это, создав объект 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";

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

Ответы [ 4 ]

5 голосов
/ 11 сентября 2012

Ответ Себето правильный.У меня была такая же проблема, и я только что попробовал.Думаю, я бы добавил еще несколько объяснений.Свойства текущей культуры действительно доступны только для чтения после установки текущей культуры.Поэтому вы должны создать новый объект 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();
}

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

3 голосов
/ 05 октября 2011

получил исключение 'System.InvalidOperationException: Instance только для чтения.', А 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;
2 голосов
/ 14 сентября 2011

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

2 голосов
/ 14 сентября 2011

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

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

...