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.

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