MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同区域性的 DateTime

本文关键字:区域性 DateTime 控制器 CurrentCulture CurrentThread MVC | 更新日期: 2023-09-27 17:56:14

我有一个 ajax 调用,将数据从日期选择器作为短日期发送到我的控制器的方法。在我的控制器中,我想使用日期来过滤表中的条目,并返回整个内容以及日期。

我的应用区域性是法语 ( fr-FR

让我们用June 12th 2015作为我们的示例。

我遇到了几个问题:

jQuery 日期选择器

默认具有dateFormat: "DD d MM yy",因此当我在日期选择器中选择 6 月 12 日时,该字段显示"vendredi 12 juin 2015",并且 JS 将"vendredi+12+juin+2015"作为我的 DateTime 字段发送,这会在控制器的方法中产生null

我决定通过重新指定要"dd/mm/yy" dateFormat来解决这个问题,无论如何都会占用更少的屏幕空间。
现在,当我选择 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",这是正确的,但由于日期格式,日期选择器将其解释为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

MVC 控制器接收从 CurrentThread.CurrentCulture 解析为不同区域性的 DateTime

尝试确保在模型绑定发生之前设置区域性。如果在控制器操作中检查System.Threading.Thread.CurrentThread.CurrentCulture设置,则可能是在模型绑定器解析日期后设置的。

您可以通过实现 IAuthorizationFilter 来检查这一点。