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 的文化:CurrentCultureCurrentUICulture 都是 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.CurrentCulturefr-FR 以及 OnAuthorizationCurrentUICulture 也是 fr-FR 在这种状态下。

以上是关于MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同文化的 DateTime的主要内容,如果未能解决你的问题,请参考以下文章

在 MVC 控制器中接收 JSON

MVC 方法接收空值

MVC 从控制器获取数据以使用 AJAX 查看有啥问题?

在 mvc 控制器中从 jquery 接收复杂对象

无法将数据从视图发送到控制器 Action .NET MVC

.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)