2016-09-24 98 views
0

在我的編輯VIEW我有以下代碼:MVC的表單字段驗證問題

<div class="form-group"> 
    @Html.LabelFor(model => model.CREATED, htmlAttributes: new { @class = "control-label col-md-2" }) 
    <div class="col-md-10"> 
     @Html.EditorFor(model => model.CREATED, new { htmlAttributes = new { @class = "form-control", @readonly = true } }) 
     @Html.ValidationMessageFor(model => model.CREATED, "", new { @class = "text-danger"}) 
    </div> 
</div> 

正如你可以看到Created文本框是隻讀的,是灰色的。

Validation fires wrongly

在我模型我有以下幾點:

public Nullable<System.DateTime> CREATED { get; set; } 

問題是,當你把光標移動到灰色的領域,然後再進入另一個領域,驗證火災錯。

我該如何解決這個問題?

+0

如果它不能被編輯,那你爲什麼要爲它創建一個表單控件?並且發生錯誤是因爲'jquery.validate.js'驗證了基於'MM/dd/yyyy'格式的日期,並且您的文化看起來像是'dd/MM/yyyy' –

+0

由於屬性的名稱表示日期記錄創建它不應該在視圖中 - 它應該只在控制器中立即保存數據模型之前設置(並且您的視圖應該使用[視圖模型](http://stackoverflow.com/questions/) 11064316/what-is-viewmodel-in-mvc)沒有'CREATED'屬性 –

+0

我想在創建時顯示,如果在'div'中創建這個值,我會面臨這個問題嗎? – PriceCheaperton

回答

1

客戶端驗證錯誤的原因是您已經爲該屬性生成了一個文本框,默認情況下,jquery.validate.js驗證基於MM/dd/yyyy格式的日期,而您的格式爲dd/MM/yyyy。您可以覆蓋$.validator,如subsequent question的答案中所述。

但是,真正的問題是,您不應該爲「創建日期」(或「修改日期」)屬性生成表單控件。這些值只能在保存對象之前立即在控制器的POST方法中設置。

在視圖中,如果您編輯現有的對象,請使用

<div>@Html.DisplayFor(m => m.CREATED)</div> 

顯示日期,你可以格式化DIV如有必要,看起來像你的其他文本框。你也應該刪除相關ValidationMessageFor()LabelFor()(你不再有關聯的表單控件所以<label>元素是不恰當的 - 你可以使用(比方說)<span>@Html.DisplayNameFor(m => m.CREATED)</span>

如果你想提交的CREATED的值,然後您還可以包括值一個隱藏的輸入(默認情況下,隱藏的輸入沒有經過驗證)

@Html.HiddenFor(m => m.CREATED) // you can use a [DisplayAttribute] for formatting the value 

但是,因爲你在編輯數據,你應該使用view model,不是你的數據模型。在POST方法中,您根據存儲庫的ID從存儲庫中獲取原始數據模型,並根據來自視圖模型的值更新其屬性(由於您不需要更新該值,所以需要隱藏輸入冗餘) 。此模式還可以防止惡意用戶更改請求併發送更改後的日期值。