簡體   English   中英

Asp.net MVC中的注釋驗證僅接受MM / dd / yyyy格式

[英]Annotation Validation in Asp.net MVC just accept MM/dd/yyyy format

我已經花了幾個小時閱讀很多文章,但是仍然無法解決我的問題。

我的模型中有一個DateTime類型的屬性:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public System.DateTime StartTime { get; set; }

我已將格式設置為dd/MM/yyyy ,因此我希望接受2014年12 dd/MM/yyyy日這樣的日期。 但是,驗證始終失敗,並顯示以下消息: The field StartTime must be a date. 我嘗試輸入2014年12月14日,可以。

在閱讀了幾篇文章之后,我嘗試用剃刀代碼編輯格式,例如:

@Html.TextBoxFor(model => model.StartTime, "{0:dd/MM/yyyy}")

並嘗試使用EditorFor,例如ataravati在以下答案中所述:

@Html.EditorFor(model => model.StartTime)

或者,將web.config中的區域性更改為GB之前一個月之前的區域性:

<system.web>
    <globalization uiCulture="en" culture="en-GB"/>  
</system.web>

但是,他們都不適合我。

我嘗試僅使用文本輸入並手動輸入日期(而不使用jqueryUI之類的任何控件)。 但是,如果驗證格式為dd / MM / yyyy,則仍然不能接受我的手動輸入。 誰能向我展示問題或向我展示解決問題的方法?

更新:對於可能與我有相同問題的人。

在斯蒂芬下面提到的帖子之后,我們必須創建一個“日期”驗證來覆蓋注釋驗證的默認值。 我們創建的自定義驗證將允許我們需要的格式。

但是,此后,發布到控制器的數據可能不包含該數據(在我的情況下,所有datetime值都設置為默認datetime)。 原因是區域性設置不接受您的格式。 我們可以在web.config中更改區域性設置,但我認為這不是最好的方法,因為它會影響項目中的其他值類型(貨幣,數字...)。 以我的方式,我創建了一個自定義ModelBinder以正確的格式綁定Datetime(此處的示例: http : //www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder )。

上面的解決方案看起來很復雜。 通過驗證不應該只是這樣,但到目前為止,我還沒有發現更好的方法。 因此,如果有人擁有更好的解決方案,可以讓注釋驗證正確地驗證格式的datetime值,請共享它。

僅當您使用@Html.EditorFor而不是@Html.TextBoxFor時, ApplyFormatInEditMode選項才有效。 將您的剃刀代碼更改為此:

@Html.EditorFor(model => model.StartTime)

實際上,對我來說可以挽救生命的一件事如下,並且您不需要任何數據注釋(除非您想要它們,等等):

@Html.TextBoxFor(m => m.StartDate, new { @Value = Model.StartDate.ToString("dd-MMM-yyyy") })

上述格式當然可以更改為任何格式。

當然,一個流行的事情就是添加一個日期選擇器。 我正在使用jQuery UI datepicker以便於使用:

@Html.TextBoxFor(model => model.StartDate, new { @Value = Model.StartDate.ToString("dd-MMM-yyyy"), @class = "form-control datepicker" })

為了完整起見,我的視圖模型類示例如下所示:

[DisplayName("Start Date")]
[Required(ErrorMessage = "An start date must be supplied")]
public DateTime StartDate { get; set; }

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM