我开发了多语言网站。用户可以更改首选语言,因此我为每个请求设置当前文化,如下所示:
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,其中它是'只需要。
答案 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的问题。