ASP.Net Core мультивалютное приложение - PullRequest
7 голосов
/ 25 июня 2019

Я конвертирую приложение из ASP.NET MVC в .NET Core, где я использовал для обработки типов валют для разных счетов.

 Thread.CurrentThread.CurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);

CustomCulture.GetCultureInfo(string CountryCode) взял валюту поставщика и создал собственную культуру с некоторым форматированием по умолчанию и текущим типом валюты.

У меня есть модель с типом валюты, в которой мы извлекаем код страны Продавца из базы данных и используем его для установки типа валюты для текущего представления.

То же самое не работает для ASP.Net Core, насколько я понимаю, так как представления выполняются в разных потоках.

По сути, это тип валюты, который изменится, например. $ или R или €.

Есть идеи, как с этим справиться?

Ответы [ 2 ]

3 голосов
/ 05 июля 2019

Работа с валютой в мультикультурной среде немного сложна.Есть несколько ценных предложений в комментариях;Я рекомендую пройтись по ним.

То же самое не работает для ASP.Net Core, насколько я понимаю, так как представления работают в разных потоках.

Вы устанавливаете культуруиз только текущий поток с использованием:

Thread.CurrentThread.CurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);

Когда новый поток разветвляется в вашем приложении, вы должны установить это снова для него.

Вместо этого вы можете установитькультура для любого потока по умолчанию с использованием DefaultThreadCurrentCulture и DefaultThreadCurrentUICulture (при запуске приложения), как показано ниже:

CultureInfo.DefaultThreadCurrentCulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);
CultureInfo.DefaultThreadCurrentUICulture = CustomCulture.GetCultureInfo(Invoice.Vendor.VendorCurrency);

Я обычно использую следующий код (при запуске приложения), который обрабатывает параметр культуры:

CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("MyCultureValue");
//Setup things here for `cultureInfo` like currency in your case....

Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

Type type = typeof(CultureInfo);
type.InvokeMember("s_userDefaultCulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    cultureInfo,
                    new object[] { cultureInfo });

type.InvokeMember("s_userDefaultUICulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    cultureInfo,
                    new object[] { cultureInfo });

Эти свойства доступны в .NET Framework 4.5 и более поздних версиях .NET Core 1.0 и более поздних версиях.

В .NET Framework 4 и предыдущих версиях по умолчанию культура всех потоков установлена ​​на системную культуру Windows.Для приложений, чья текущая культура отличается от системной культуры по умолчанию, такое поведение часто нежелательно.В .NET Framework 4.5 свойство DefaultThreadCurrentCulture позволяет приложению определять культуру по умолчанию для всех потоков в домене приложения.

Если вы явно не задали культуру существующих потоков, выполняющихся в домене приложения,установка свойства DefaultThreadCurrentCulture также изменяет культуру этих потоков.Однако если эти потоки выполняются в другом домене приложения, их культура определяется свойством DefaultThreadCurrentCulture в этом домене приложения или, если значение по умолчанию не определено, системным языком системы по умолчанию.В связи с этим мы рекомендуем всегда явно задавать культуру основного потока приложения и не полагаться на свойство DefaultThreadCurrentCulture для определения культуры основного потока приложения.

Если не указано явно, значениесвойства DefaultThreadCurrentCulture имеет значение null, а культура потоков в домене приложения, для которых не была назначена явная культура, определяется системной культурой Windows по умолчанию.

2 голосов
/ 01 июля 2019

Если у вас уже есть требуемая культура, которая выглядит так, как будто у вас уже есть, то вы можете просто использовать string.Format следующим образом:

string.Format(Invoice.Vendor.VendorCurrency, "{0:C}", amount);

Это также позволит вам указать разные культуры в разных местах.что может быть выгодно в некоторых ситуациях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...