【问题标题】:Date model binding in ASP.NET CoreASP.NET Core 中的日期模型绑定
【发布时间】:2017-09-21 02:56:21
【问题描述】:

我正在构建一个 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

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

我一开始以为跟文化和全球化有关,但是这已经在 Startup configure 方法中设置为:

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);

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

【问题讨论】:

  • 这个 SO stackoverflow.com/questions/16826093/… 有一个更长的解释为什么它会以这种方式运行并且 JSON.net 不涉及这里。同一篇文章中的另一个答案使用自定义 IModelBinder 为 asp.net(不是核心!)提供了解决方案。我确信在 asp.net core 中也有类似的可能性。

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


【解决方案1】:

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

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

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

【讨论】:

  • 当日期绑定 FromBody 时,这确实有效,它是 JSON。但不是在查询字符串被绑定时,如问题中那样。
猜你喜欢
  • 2013-10-11
  • 2019-09-25
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多