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 的文化是什么:CurrentCulture
和CurrentUICulture
都是{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
?
尝试确保在模型绑定发生之前设置区域性。如果在控制器操作中检查System.Threading.Thread.CurrentThread.CurrentCulture
设置,则可能是在模型绑定器解析日期后设置的。
您可以通过实现 IAuthorizationFilter 来检查这一点。