C# 将UICulture设置为Html.EditorFor方法
在我的应用程序中,MVC区域设置为“en-US”,UICulture设置为“nl-nl”。C# 将UICulture设置为Html.EditorFor方法,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,在我的应用程序中,MVC区域设置为“en-US”,UICulture设置为“nl-nl”。 我有一个视图,可以呈现包含Datetime对象的模型。 如果我这样渲染它: Html.EditorFor(x => x.ForFilter.FromDate) 它将以en US文化格式显示。因此,为了以荷兰语格式显示日期,我必须这样做: var shortDatePattern = System.Threading.Thread.CurrentThread.CurrentUICulture.Dat
我有一个视图,可以呈现包含Datetime对象的模型。
如果我这样渲染它:
Html.EditorFor(x => x.ForFilter.FromDate)
它将以en US文化格式显示。因此,为了以荷兰语格式显示日期,我必须这样做:
var shortDatePattern = System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern;
@Html.TextBoxFor(x => x.ForFilter.FromDate, new {Value = Model.ForFilter.FromDate.ToString(shortDatePattern) })
我知道存在可用于DateTime
字段的DisplayFormat
属性,但这不是解决方案,因为UICulture
是在运行时确定的
那么,有没有更优雅的解决方案告诉EditorFor
和TextboxFor
方法使用UICulture
而不是Culture
Model.ForFilter.FromDate.ToString("d", CultureInfo.CurrentUICulture)
会比你现在拥有的更优雅
但是,如果您想要在nl nl区域性中格式化日期(可能还有数字),为什么不将CurrentCulture
设置为nl nl nl
例如:
Microsoft似乎忘记了MVCYE中存在非美国格式的日期,我还有另一个例子。当通过Session.CreateSQLQuery()和List()方法使用nhibernate执行手工编写的sql查询时,只会得到一个原始对象。然后,如果您尝试执行类似Convert.ToDateTime(x[1])的操作;其中,x是来自原始对象的对象数组,如果您使用的任何SQL server返回的日期格式与应用程序区域性的预期格式不匹配,则会遇到问题。这是应用程序区域性不能始终与UICulture相同的另一个原因,因为区域性是在运行时确定的。因此,对于用户X来说,文化必须是荷兰语,但对于其他用户来说,文化必须是德语。因此,我将应用程序区域性保留为en US,并且更改了UICulture,以便按照用户区域性对所有资源/日期/数字进行格式化。@user1980412-那么,为什么不将CurrentCulture设置为用户特定的区域性呢?因为有些代码依赖于en US区域性来构建一些SQL查询。例如,当进行插入/更新时,被更新的值是一个浮点值,应该在SQL级别表示为4.12,如果我将区域性设置为nl nl,我将得到4,12。如果UI也依赖于应用程序的区域性,那么我也看不到拥有UICulture属性的意义。在ASP.NET Web表单中,如果我没记错的话,在为表单上的标签设置一些值时会考虑UICulture,例如。@user1980412-那么您应该使用参数化查询。但是,如果您想生成与区域性无关的字符串,无论是对于SQL查询还是其他任何内容,都应该使用CultureInfo.InvariantCulture。我同意您使用参数化查询。例如,在使用资源时,MVC会考虑UICulture,从而为指定的资源键显示正确的字符串,这对我来说是不正确的,并且在ModelBinding的情况下或尝试执行上面描述的操作时不会发生这种情况。从这次讨论中我学到的教训是,我必须确保系统在任何文化下都能正常工作,并且忘记MVC中的UICulture。
<globalization culture="nl-NL" uiCulture="nl-NL" />