2017-02-02 219 views
6

在我的ASP MVC 5 Web應用程序中,我需要以特定格式顯示日期。加載頁面時,文本格式正確。但是,如果你編輯的值或者幹​​脆嘗試後,顯示的驗證錯誤:ASP MVC 5日期格式驗證問題

enter image description here

的字段定義是這樣的:

 @*Creation*@ 
    <div class="form-group"> 
     @Html.LabelFor(model => model.Creation, new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.TextBoxFor(model => model.Creation, "{0:dd/MM/yyyy}", new { @class = "form-control"}) 
      @Html.ValidationMessageFor(m => m.Creation) 
     </div> 
    </div> 

視圖模型屬性定義爲:

 [DataType(DataType.Date)] 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] 
    [Display(Name = "Creation", ResourceType = typeof(Resources.Resources))] 
    public DateTime Creation { get; set; } 

該屏幕截圖是使用Firefox瀏覽器創建的。如果我在Edge上執行同樣的操作,驗證通過,但post方法中此屬性的綁定無效(默認日期值)。

我該如何解決這個問題?

+1

馬特·斯平克斯指出,這是一個'jquery.validate.js'問題(它驗證基於'MM/dd/yyyy'的日期),你需要重寫驗證器(參考[這個答案](http://stackoverflow.com/questions/30594128/error-in-date-validation-mvc/30609111 #30609111) –

+1

它在Edge(和Chrome)中工作的原因是因爲你有'[DataType(DataType.Date)] ''生成'type =「date」''這意味着瀏覽器將實現一個DatePicker將被顯示,但爲了使其正常工作,您需要使用'DataFormatString =「{0:yyyy-MM-dd}」(ISO格式) –

+1

另請參閱[這個答案](http://stackoverflow.com/questions/39677035/date-of-birth-validation-keeps-showing/39682410#39682410)其中包括一個腳本,你可以在你的視圖中包含一個腳本,用於客戶端驗證。 –

回答

5

這裏的問題是,在幕後,驗證實際上是由jQuery執行的。因此,關鍵是告訴jQuery驗證程序您將使用格式爲dd/MM/yyyy格式。

有幾種方法可以做到這一點。最簡單的方法是隻覆蓋驗證功能(日期)與simpe的調整:

jQuery(function ($) { 
    $.validator.addMethod('date', 
    function (value, element) { 
     $.culture = Globalize.culture("en-AU"); 
     var date = Globalize.parseDate(value, "dd/MM/yyyy", "en-AU"); 
     return this.optional(element) || 
     !/Invalid|NaN/.test(new Date(date).toString()); 
    }); 
}); 

另一種方法是使用一個全球化庫jQuery的。有一個全球化圖書館,您可以使用here

當你有圖書館,包括這些文件:

globalize.js 
globalize.culture.en-AU.js 

然後覆蓋驗證功能:

<script type="text/javascript"> 
    $(function() { 
     $.validator.methods.date = function (value, element) { 
      Globalize.culture("en-AU"); // the UK format 
      return this.optional(element) || Globalize.parseDate(value) !== null; 
     } 
    }); 
</script> 
+0

嗨@Matt,我安裝了庫(通過NuGet包),沒有手動添加任何文件,然後重寫驗證功能。我的位置是pt-BR,所以我將「en-AU」替換爲「pt」。現在驗證沒有得到任何東西。如果我輸入一個錯誤的日期,如:30/12/2016dssfds它不驗證。此外,綁定仍然失敗。有任何想法嗎? –

+0

您可能會檢查以確保您的所有文件都被正確包含(不是404)。 –

+0

我也試過你建議的最簡單的方法(簡單的調整),結果是完全一樣的。沒有驗證發生。我刪除了全球化軟件包,以確保它不影響調整。通過檢查404's是什麼意思? –