2012-01-18 71 views
19

我的申請是設置好的與PT-BR培養物(培養物),導致錯誤到控制器(日期是DD-MM-YYYY)在web.config中:傳遞一個DateTime經由URL在ASP .NET MVC 3

<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" /> 

我的系統上創建的所有日期時間是正確的格式,但我創建了一個控制器的方法類似:

public ActionResult Test(DateTime date) 
{ 
} 

調用該方法直接在瀏覽器中通過空時的日期與葡萄牙-BR格式,像:

mysite/Test/?date=19/01/2012 => date = null in my controller 

mysite/Test/?date=01/01/2012 => date is fine, but in US format (mm-dd-yyyy) 

我該如何解決這個問題,接受我的日期格式?

回答

51

有與不容易瞭解,但一旦你知道它,你不再犯同樣的錯誤的默認模型粘合劑的疑難雜症:

  • 當您使用POST請求,默認的模型綁定使用您的文化設置來解析日期。

  • 當您使用GET請求時,默認模型聯編程序將使用CultureInfo.InvariantCulture解析日期並忽略當前的區域性設置。

由於您使用的是GET請求,並傳遞日期作爲查詢字符串參數,你應該在URL發送時使用固定區域性的格式進行格式化。格式化日期作爲查詢字符串參數的正確方法是yyyy-MM-dd

你可以看看的following blog post其進入更多的細節。

+1

如果您實施自定義聯編程序,請確保爲DateTime註冊它?而且,不僅僅是DateTime。 – Justin 2014-04-06 17:01:50

+0

你好,達林。我遇到了與原文相同的問題,並且您的回答和引用的文章幫助我理解了該問題,但我還無法找到答案。我正在研究ASP.NET Core 2.0,但我不知道如何應用文章的推薦。希望你可以看看這個問題:https://stackoverflow.com/questions/47442368/routing-datetime-parameter-passing-as-null-empty – 2017-11-23 04:04:57

2

一個辦法是接受日期作爲字符串,然後操縱它在控制器中正確的語言環境/文化。

8

作爲一個在美國公司工作很多的人,我在日期問題上有很多經驗。

我最好的建議是在傳輸時選擇一個明確的格式。

dd-MMM-yyyy 

yyyy-MM-dd 

是安全的賭注,並將於DateTime.Parse(OBJ)成功分析。

如果更改日期格式是不是一種選擇,你應該看看DateTime.ParseExact,它允許您指定確切格式字符串你是後。

0

在視圖中使用@Html.Action(..)得到了同樣的問題。

public class MyModel 
{ 
    public DateTime Value {get;set;} 
} 

,並在視圖:

@Html.Action("MyAction", new { myModel }) 

注意周圍的MyModel實例的new { },這種方式DateTime不轉換對於這種情況,可以通過將DateTime在模型中解決到一個字符串。此解決方案僅適用於Html.Action()而非,因爲Html.ActionLink()Url.Action(),因爲MVC在URL中執行myModel.ToString()