MVC Controller从CurrentThread.CurrentCulture接收解析为不同文化的DateTime

时间:2015-06-15 16:24:13

标签: c# asp.net-mvc datetime culture

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

我的应用文化是法语(fr-FR

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

我遇到了几个问题:

jQuery datepicker默认为dateFormat: "DD d MM yy",所以当我在日期选择器中选择6月12日时,该字段显示“vendredi 12 juin 2015”,JS发送"vendredi+12+juin+2015"作为我的DateTime字段,在控制器的方法中产生null

我决定通过将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,其中(in)正确地将6月12日转换为"06/12/2015",这会在控制器的方法中产生{12/06/2015 00:00:00}。这可以工作,但是当我的日期重新插入页面时,它是“12/06/2015”,这是正确的,但由于日期格式,由datepicker解释为12月12日。

我还尝试使用$('#date').datepicker({ dateFormat: "mm/dd/yy "}).val()发送值,并将第一次调用时的datepicker格式保留为"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},但我的DateTime以"12/06/2015"(6月12日)发送到请求被解析为"06/12/2015"(12月6日),然后传递给我的控制器方法。

为什么在服务器解析日期时似乎没有考虑我的CurrentCulture

1 个答案:

答案 0 :(得分:0)

尝试确保在模型绑定发生之前设置您的文化。如果您检查控制器操作中的System.Threading.Thread.CurrentThread.CurrentCulture设置,那么在模型绑定器解析日期之后设置它是可行的。

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