【发布时间】: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