2017-04-24 62 views
1

我構建了一個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); 

換句話說,繞過模型綁定。不過,我想知道:爲什麼模型綁定在這裏呈現這種奇怪的行爲?

+0

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

回答

2

對我來說,它看起來像在後臺使用Json.net的模型聯編程序將您的UTC時間轉換爲BRT(UTC-3)的本地時間,這就是您看到日期和時間更改的原因。你應該能夠更新你的JsonSerializerSettings屬性爲:

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

這應該照顧正確的模型綁定在你的情況。

+0

當日期綁定爲JSON的FromBody時,這起作用。但是,當查詢字符串被綁定時,就像在問題中一樣。 –