ASP.NET Core中的日期模型绑定

时间:2017-04-24 12:17:26

标签: asp.net .net json asp.net-core .net-core

我正在构建一个ASP.NET Core Web API,我最近发现了一个关于DateTime值绑定的问题。

实际上,我有一个minimumDate和一个maximumDate属性可以在某个资源中进行过滤。它们是一个Filtering对象的一部分,它只是通过模型绑定在控制器上填充。

问题是请求是这样发送的:

minimumDate=2014-01-20T00:00:00.000Z&maximumDate=2014-03-21T00:00:00.000Z

并在控制器上进行调试时获取:

MinimumDate = 19/01/2014 22:00:00
MaximumDate = 20/03/2014 21:00:00

这显然是错误的。预期是:

MinimumDate = 20/01/2014 00:00:00
MaximumDate = 21/03/2014 00:00:00

它在最短和最大日期都减少了一天,而且它正在弄乱时间部分。

我一开始认为它与文化和全球化有关,但这已经在启动配置方法中设置为:

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pt-BR");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("pt-BR"); 

所以我怀疑这是原因。

我做错了什么?如何通过模型绑定正确地将日期发送到API?

编辑我设法通过以下方式手动解析日期时间对象来解决问题:

filtering.MinimumDate = DateTime.Parse(this.Request.Query["minimumDate"], null, System.Globalization.DateTimeStyles.RoundtripKind);
filtering.MaximumDate = DateTime.Parse(this.Request.Query["maximumDate"], null, System.Globalization.DateTimeStyles.RoundtripKind);

换句话说,绕过模型绑定器。不过,我想知道:为什么模型绑定会在这里出现这种奇怪的行为?

1 个答案:

答案 0 :(得分:3)

对我而言,在幕后使用Json.net的模型绑定器将您的UTC时间转换为BRT(UTC-3)的本地时间,这就是您看到日期和时间更改的原因。您应该能够将JsonSerializerSettings属性更新为:

new JsonSerializerSettings
{
     .....
   DateTimeZoneHandling = DateTimeZoneHandling.Utc,
    .....
} 

在你的情况下应该注意正确的模型绑定。