我構建了一個ASP.NET Core Web API,並且最近發現了一個有關DateTime值綁定的問題。ASP.NET Core中的日期模型綁定
事實上,我有一個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?
編輯我設法manualy解析使用datetime對象來解決這個問題:
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);
換句話說,繞過模型綁定。不過,我想知道:爲什麼模型綁定在這裏呈現這種奇怪的行爲?
This SO https://stackoverflow.com/questions/16826093/asp-net-webapi-deserializes-utc-time-string-to-local-time有一個更長的解釋,爲什麼它表現這種方式,並且JSON.net這裏沒有涉及。在同一篇文章中的另一個答案爲使用自定義IModelBinder的asp.net(不核心!)提供了一個解決方案。我相信在asp.net核心中有類似的可能性。 – NicolasR