2012-08-28 75 views
12

我有下面的代碼工作MVC 4 - DataAnnotations - 驗證對類型

[Required(ErrorMessage = "Price is required.")] 
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price xx.xx")] 
    public decimal? productPrice { get; set; } 

當頁面與 價格提交=空字段錯誤消息是「價格是必需的。」。 Price =超過9999的錯誤信息是「Price xx.xx」。

但是,當我鍵入'aaaa'時,錯誤消息是 「字段productPrice必須是一個數字。」

如果輸入的內容不正確,我該如何更改信息? 像:「價格必須爲1-9999之間的小數/數字

---- UPDATE:---- 下面的代碼

NULL,不是小數工作,範圍之間,但與」 .1" 工作

[Required(ErrorMessage = "Price is required.")] 
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Price must be a Numbers only.")] 
    [Range(typeof(Decimal), "1", "9999", ErrorMessage = "Price must be a decimal/number between {1} and {2}.")] 
    public decimal? productPrice { get; set; } 

回答

12

你可以用正則表達式嘗試:

[RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "{0} must be a Number.")] 

你CA n您還可以嘗試將數據註解擴展: http://dataannotationsextensions.org/Home/Wiki

或者自己寫的實現,這樣的事: https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

UPDATE 隨着正則表達式(匹配$ 9,999.99 | $ 0.70 | 1.1)

[RegularExpression(@"^\$?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$", ErrorMessage = "{0} must be a Number.")] 

或者使用範圍有輕微的修改建議@馬丁(實際上是一個更好的解決方案):

[Range(typeof(Decimal), "0", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")] 
+2

這個正則表達式在各種情況下會失敗,例如「.1」我不推薦使用正則表達式來緊縮數字。正則表達式用於匹配字符串(文本)輸入。 RangeAttribute是解決此問題的最合適的方法。 –

+0

@JOBG正如馬丁所說,「.1」沒有被(3)DataAnnotations中的任何一個捕獲。有什麼想法嗎? –

+0

只需將@MartinDevillers Range方法從1-999更改爲0-999,並且應該讓「.1」通過,正如我之前所說的那樣,Range是一個更好的解決方案。我還添加了一個正則表達式,以防你想檢查。 – JOBG

5

首先,我想你會想你的範圍屬性更改爲

[Range(typeof(Decimal), "1", "9999", ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")] 

According to MSDN,這是使用RangeAttribute的有效途徑。

二:

「這個領域productPrice必須是一個數字。」

這實際上是不顯眼的客戶端JavaScript驗證踢。你的範圍驗證器將在數字驗證後觸發。您可以禁用數字驗證器雖然我不建議這樣做:

$.validator.methods.number = function (n, t) { 
    return true; 
} 
+0

這不會驗證起始數字0的字符串,如0007,0500 – mko

0

我想你可能會絆倒在jQuery中的錯誤。該驗證正在與爲驗證屬性發射的東西作鬥爭。

我有以下特性:

[Display(ResourceType = typeof(TaxSetupResources), Name = "Model_Value")] 
[RegularExpression(@"(^\d+$)|(^\.\d{1,4}$)|(^\d*\.\d{0,4}$)", ErrorMessageResourceName="Model_InvalidFormatForAmount", ErrorMessageResourceType=typeof(TaxSetupResources))] 
public decimal? Value { get; set; } 

用在這樣一個觀點:

<div> 
    @Html.TextBoxFor(t => t.Tiers[i].Value, new { title = @Resources.TaxSetupResources.Model_ValueTip }) 
    <br />@Html.ValidationMessageFor(t => t.Tiers[i].Value) 
</div> 

就其本身而言,一個 「foo」 值產生了我的錯誤消息。值0.075被接受。值爲0.075會產生「字段值必須是數字」,這是您似乎遇到的同一問題。

基於this SO article,我加在文件準備好以下幾點:

$(function() { 
    $.validator.methods.number = function (value, element) { 
     return parseFloat(value).toString() !== "NaN"; 
    } 
}); 

現在我只得到我的錯誤消息,並且只有當預期(0.075被接受)。