ASP.NET MVC。多语言网站。尽管用户的文化,为所有DateTime设置了不变的文化

时间:2017-08-27 07:14:33

标签: c# asp.net asp.net-mvc invariantculture

我开发了多语言网站。用户可以更改首选语言,因此我为每个请求设置当前文化,如下所示:

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; }

}

我的问题是:尽管用户的文化,我如何在我的WebApplication与Invariant Culture的所有DateTime中进行全球互动?我想在数据库中保存DateTime(我正在使用实体框架),更新它们,计算它们,解析不变文化中的字符串等。我将在用户的文化中显示DateTime,其中它是'只需要。

1 个答案:

答案 0 :(得分:0)

嗯,我最大的问题是我设置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的问题。