【问题标题】:Set UICulture to Html.EditorFor method将 UICulture 设置为 Html.EditorFor 方法
【发布时间】:2014-01-30 13:30:10
【问题描述】:

在我的应用程序中,MVC 文化设置为“en-US”,UICulture 设置为“nl-NL”。
我有一个视图,它呈现一个包含 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 是在运行时确定的。

那么,有没有更优雅的解决方案告诉EditorForTextboxFor 方法使用UICulture 而不是Culture?

【问题讨论】:

  • 微软似乎忘记了 MVC 中存在非美国格式的日期
  • 是的,我还有另一个例子。当通过 Session.CreateSQLQuery() 然后 List() 方法使用 nhibernate 执行手写 sql 查询时,您只会得到一个原始对象。然后,如果您尝试执行 Convert.ToDateTime(x[1]); 之类的操作其中 x 是来自原始对象的对象数组,如果从您使用的任何 SQL 服务器返回的日期格式与应用程序文化的预期格式不匹配,则会遇到麻烦。这是应用程序文化不能始终与 UICulture 相同的另一个原因。

标签: c# asp.net-mvc razor


【解决方案1】:
Model.ForFilter.FromDate.ToString("d", CultureInfo.CurrentUICulture)

会比你目前拥有的更优雅。

但是,如果您想要在 nl-NL 文化中格式化日期(可能还有数字),为什么不将 CurrentCulture 设置为 nl-NL?

例如in web.config:

<globalization culture="nl-NL" uiCulture="nl-NL" />

【讨论】:

  • 因为文化是在运行时确定的。因此,对于用户 X,文化必须是荷兰语,但对于其他一些用户,它必须是德语。所以我保持应用程序文化 en-US 并更改 UICulture 以便根据用户文化格式化所有资源/日期/数字。
  • @user1980412 - 那么为什么不简单地将 CurrentCulture 设置为用户特定的文化呢?
  • 因为有一些代码依赖于 en-US 文化来构建一些 SQL 查询。例如,当进行插入/更新时,被更新的值是一个浮点数,应该在 SQL 级别表示为 4.12,如果我将 Culture 设置为 nl-NL,我会得到 4,12。如果我也应该为 UI 依赖应用程序的文化,那么我也不再看到拥有 UICulture 属性的意义。此外,在 ASP.NET Web 表单中,如果我没记错的话,例如在为表单上的标签设置一些值时会考虑 UICulture。
  • @user1980412 - 那么您应该使用参数化查询。但是,如果您想生成与文化无关的字符串,无论是用于 SQL 查询还是其他任何内容,您都应该使用 CultureInfo.InvariantCulture。
  • 我同意您使用参数化查询的观点。我觉得不对,例如,在使用 Resources 时,MVC 确实考虑了 UICulture,因此显示了指定资源键的正确字符串,并且在 ModelBinding 或尝试做某事时不会发生这种情况就像我上面描述的那样。我从这次讨论中学到的教训是,我必须确保系统在任何文化中都能正常工作,并且忘记 MVC 中的 UICulture。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多