MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同文化的 DateTime
Posted
技术标签:
【中文标题】MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同文化的 DateTime【英文标题】:MVC Controller receives DateTime parsed as different culture from CurrentThread.CurrentCulture 【发布时间】:2015-06-15 16:24:13 【问题描述】:我有一个 ajax 调用,将日期选择器中的数据作为短日期发送到我的控制器方法。在我的控制器中,我想使用日期来过滤表格中的条目,然后将整个内容与日期一起返回。
我的应用的文化是法语 (fr-FR
)
让我们使用June 12th 2015
作为示例。
我遇到了几个问题:
jQuery 日期选择器默认具有dateFormat: "DD d MM yy"
,因此当我在日期选择器中选择 6 月 12 日时,该字段显示“vendredi 12 juin 2015”并且 JS 发送 "vendredi+12+juin+2015"
作为我的 DateTime 字段,从而产生 @987654326 @ 在控制器的方法中。
我决定通过将 dateFormat
重新指定为 "dd/mm/yy"
来解决这个问题,这无论如何都会占用更少的屏幕空间。
现在,当我选择 6 月 12 日时,字段保持(并且 JS 发送)"12/06/2015"
在控制器的方法中产生06/12/2015 00:00:00
,其中 12 为月份,06 为日期。我检查了我的System.Threading.Thread.CurrentThread.CurrentCulture
,发现它是fr-FR
,所以我不明白为什么"12/06/2015"
被解析为12 月6 日。
我在控制器中实现了IAuthorizationFilter
,以在OnAuthorization
中查看 CurrentThread 的文化:CurrentCulture
和 CurrentUICulture
都是 fr-FR
我试着把它转过来,并将日期选择器格式设置为 mm/dd/yyyy
,它(不)正确地将 6 月 12 日转换为 "06/12/2015"
,在控制器的方法中产生 12/06/2015 00:00:00
。这可能有效,但是当我的日期重新插入页面时,它是“12/06/2015”,这是正确的,但由于日期格式,datepicker 将其解释为 12 月 12 日。
我还尝试使用$('#date').datepicker( dateFormat: "mm/dd/yy ").val()
发送值,并在第一次调用时将日期选择器格式保留为"dd/mm/yy"
,但这仍然给了我格式化为"dd/mm/yy"
的值
我必须像这样解析并格式化日期:
$.datepicker.formatDate("mm/dd/yy", $.datepicker.parseDate("dd/mm/yy", $('#date').val()))
为了“反转”月份和日期,欺骗服务器将其解析为 6 月 12 日。
附加信息:我的 Web.config 中没有 <globalization ...>
,也没有任何自定义模型绑定器。
如果您需要,我也许可以尝试拥有 SSCCE,但看起来很难缩小...
TL;DR:当我在控制器方法中的第一行中断时,我显示了CurrentThread.CurrentCulture = fr-FR
,但我在请求中以"12/06/2015"
(6 月 12 日)发送的 DateTime 被解析为"06/12/2015"
(12 月 6 日)在传递给我的控制器方法之前。
为什么在服务器解析日期时我的CurrentCulture
似乎没有被考虑在内?
【问题讨论】:
重复?:***.com/questions/23566747/… 可能相关,但我自己没有调用 DateTime.Parse 所以绝不是重复的。我需要一个基于 MVC 自动模型绑定的答案,它没有正确完成它的工作 你能说出你的CurrentUICulture
值是多少吗?
可能fr-FR
文化将dd/MM/yyyy
作为标准日期和时间格式,而不是MM/dd/yyyy
。
@SonerGönül 就是这样,dd/MM/yyyy
应该将 "12/06/2015"
解析为 6 月 12 日,但它会将其解析为 12 月 6 日。
【参考方案1】:
尝试确保在模型绑定发生之前设置您的文化。如果您在控制器操作中检查 System.Threading.Thread.CurrentThread.CurrentCulture
设置,则很可能是在模型绑定器解析日期之后设置的。
您可以通过实现 IAuthorizationFilter 来检查这一点。
【讨论】:
System.Threading.Thread.CurrentThread.CurrentCulture
是 fr-FR
以及 OnAuthorization
。 CurrentUICulture
也是 fr-FR
在这种状态下。以上是关于MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同文化的 DateTime的主要内容,如果未能解决你的问题,请参考以下文章