ASP.NET MVC. Многоязычный сайт. Установить инвариантную культуру для всех DateTime, несмотря на культуру пользователя
Я разрабатываю многоязычный сайт. Пользователи могут менять предпочитаемый язык, поэтому я устанавливаю текущую культуру для каждого запроса следующим образом:
System.Threading.Thread.CurrentThread.CurrentCulture = /* user preferred culture */
System.Threading.Thread.CurrentThread.CurrentUICulture = /* user preferred culture */
Объекты моего домена имеют свойство DateAdded (для установки даты создания записи):
public class EntityBase
{
protected EntityBase()
{
DateAdded = DateTime.UtcNow;
}
[Required]
public int Id { get; set; }
public DateTime DateAdded { get; set; }
}
Мой вопрос: как я могу глобально взаимодействовать со всеми DateTime в моем Web-приложении с Invariant Culture, несмотря на культуру пользователя? Я хочу сохранить DateTime в базе данных (я использую Entity Framework), обновить их, вычислить их, проанализировать строки в инвариантной культуре и т. Д. Я покажу DateTime в культуре пользователя, где это необходимо только.
1 ответ
Ну, моя самая большая проблема была я поставил CurrentCulture
поздно. Я установил это в контроллере OnActionExecuting
метод вроде так:
public abstract class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var culture = GetUserCultureSomehow();
var cultureInfo = new System.Globalization.CultureInfo(culture);
System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
base.OnActionExecuting(filterContext);
}
}
Но в некоторых сценариях уже слишком поздно, то есть ModelBinder связывает данные из запроса POST, прежде чем будет вызвано какое-либо действие.
Я переместил эту логику вверх по конвейеру запросов, то есть:
protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
//set culture here;
}
Это гарантирует, что культура устанавливается как можно скорее для каждого запроса. После этого у меня нет проблем с преобразованием строк в DateTime.