0

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

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 中与所有 DateTime 进行全局交互?我想将 DateTime 保存在数据库中(我使用实体框架),更新它们,计算它们,解析不变文化中的字符串等。我将在用户文化中只需要它的地方显示 DateTime。

4

1 回答 1

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 没有问题。

于 2017-08-27T10:11:00.307 回答