2011-07-27 78 views
2

我在我的視圖中驗證了我的奇怪行爲。MVC3屬性驗證問題

我的模特擁有此屬性。

[Display(Name = "Overflow Capacity")] 
    [RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")] 
    [Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")] 
    public decimal OverFlowCapacity { get; set; } 

我的看法有這樣的:

<tr> 
    <td>@Html.LabelFor(m=> m.OverFlowCapacity)</td> 
    <td>@Html.EditorFor(m=>m.OverFlowCapacity)</td>            
    <td> @Html.ValidationMessageFor(model => model.OverFlowCapacity)</td> 
</tr> 

如果我進入像「ABC」的值,我得到「所需數量」 確認消息。如果我輸入的999999值,我得到的驗證消息「值必須介於0 - 9,999.99之間'

這兩個消息都是在我按預期方式標籤出文本框時收到的。 當我將文本框的值保留空白並關閉標籤時,我無法獲得正常預期的錯誤。

但是,當我提交時,我收到一條驗證消息'需要溢出容量字段'。

我不知道這是從哪裏來的。我嘗試從模型中刪除所有驗證屬性,並仍然獲得「必需」消息。我很茫然。

這裏是我引用的腳本。

我有mvcfoolproof其他問題,我以後可能會發布。我想知道這是不是對我的問題負責。

回答

8

什麼現在發生的是在提交表單並確定decimal的值不能爲null後,驗證後正在踢入。現在您正在使用不可空的decimal類型。如果您想要這種行爲,並且希望在提交表單之前查看驗證,請將[Required]屬性添加到屬性中。但是,如果您不要想要此功能,它可能是null,然後將您的類型從decimal更改爲decimal?Nullable<decimal>

不允許空值和有預提交驗證:

[Display(Name = "Overflow Capacity")] 
[RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")] 
[Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")] 
[Required] 
public decimal OverFlowCapacity { get; set; } 

允許空值和擺脫後提交驗證錯誤:以上

[Display(Name = "Overflow Capacity")] 
[RegularExpression(@"[-+]?[0-9]*\.?[0-9]?[0-9]", ErrorMessage = "Number required.")] 
[Range(0,9999.99,ErrorMessage = "Value must be between 0 - 9,999.99")] 
public decimal? OverFlowCapacity { get; set; } 
+0

恕我直言只需要的屬性將使沒有差異的錯誤消息,因爲你不重寫它 –

+0

謝謝亞歷山大。我對MVC相當陌生,所以有時甚至是明顯的逃脫我。我只在閱讀答案的前兩行後才知道解決方案。 –

+0

@穆罕默德你是正確的,它不會影響他已經得到的錯誤,但添加它會讓你看到驗證,一旦領域失去焦點,然後提交。我不確定傑夫是否想要這個錯誤,所以我把這個解決方案包括在內並將其刪除。 –

1

由於您沒有將十進制類型標記爲可空,因此MVC不知道如何處理您發佈的空白字段。如果你想允許空/空場試試這個:

public decimal? OverFlowCapacity { get; set; } 

,如果你希望它有一個預先提交需要現場確認消息填寫試試這個:

[Required] 
public decimal OverFlowCapacity { get; set; } 
0

答案解釋所需的錯誤消息相當好,所以我只專注於第二個錯誤消息。即如果你把'abc'jquery告訴你「Number Required」。jquery如何知道這個輸入只能接受數字字段。答案是;通過使用表單字段生成的不顯眼的屬性。如果檢查輸入字段,你會發現像

<input name="OverFlowCapacity" id="OverFlowCapacity" data-val-number="Number Required"..../> 

因此重寫你有,做同樣的事情(數字驗證)屬性來裝點你的模型這個默認的驗證消息,他們可以覆蓋驗證消息

[Numeric(ErrorMessage="override message")] 
[Required(ErrorMessage="override Required message")] 
public decimal OverFlowCapacity{get;set;} 

我懷疑數值屬性存在於DataAnnotation或mvc框架中。你必須檢查。有一些有用的屬性討論和可用here

+0

所需的數量來自正則表達式驗證。 –