【发布时间】:2014-12-17 12:11:01
【问题描述】:
在我们的应用程序中,我们为用户存储了一种文化。例如“en-US”。 然后,当我们在视图中显示日期时,我们会这样做:
date.ToString("d", user.CultureInfo)
这导致用户以他喜欢的方式查看日期。 当然,用户以同样的方式输入日期。例如,美国日期“2014 年 12 月 1 日”是 2014 年 12 月 1 日。 当 MVC 尝试自动转换它并且 MVC 线程运行另一种文化时,用户不喜欢它一开始转换错误。该日期被意外转换为 2014 年 1 月 12 日。 为了解决这个问题,我创建了一个自定义 DateTime 模型绑定器:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var date = value.ConvertTo(typeof(DateTime), HttpContext.Current.UserContext().CultureInfo);
return date;
}
现在我们在用户实际文化的帮助下转换日期。 但这不幸地导致了另一个问题。例如,在不同的视图中,我们有一个隐藏的输入,如下所示:
@Html.HiddenFor(m => m.created)
这将使用 MVC 线程 (1.12.2014) 的默认区域性编写。但是当用户返回数据时,自定义模型绑定器将尝试按用户文化转换日期,并且转换出错。 我可以通过像这样的视图代码来解决这个问题(或使用用户文化对其进行格式化):
@Html.HiddenFor(m => m.created, new { @Value = Model.created.ToString("yyyy-MM-dd") })
因为这种日期格式看起来总是正确的。 但我想避免搜索所有代码来试图找到我需要更改的所有地方。而且我肯定会留下错误。 本地化很常见,所以我似乎遗漏了一些东西。这应该是解决问题的一种更简单的方法。 如果不是,那么我该如何解决我创建的后一个问题?有没有办法通过一些全局设置以相同的方式输出这些日期,而不必更改受此影响的每一行代码?
【问题讨论】:
-
您能否在自定义活页夹中使用
DateTimepRaseExact将字符串转换为DateTime从用户的文化中传递格式(CultureInfo.DateTimeFormat.ShortDatePattern和适用于隐藏字段?但是,如果隐藏字段是dd/mm/yyyy和客户的mm/dd/yyyy含糊不清且不可避免(最好对所有非用户显示日期使用 ISO 格式)。
标签: c# asp.net-mvc datetime localization