2012-08-28 5 views
12

の検証、私は次のコードは、 MVC 4 - DataAnnotations - ページが 価格で提出される場合はタイプ

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

を働いている=空のフィールドのエラーメッセージは、「価格が必要です。」です。 価格= 9999以上のエラーメッセージは「価格xx.xx」です。

ただし、「aaaa」と入力すると、エラーメッセージは 「フィールドproductPriceは数字である必要があります。

タイプが正しくない場合、どのようにメッセージを変更できますか? のように:。「価格1-9999間の進/番号でなければなりません

---- UPDATE:---- 以下のコードは、レンジの間、

NULL、未進で働いていましたしかし、「0.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

あなたは正規表現を試すことができます。あなたがCA

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

http://dataannotationsextensions.org/Home/Wiki

したり、独自の実装を記述し、このような何か::| REGEXで https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

UPDATE ($ 9,999.99にマッチn個ものデータ注釈拡張機能を試してみてください$ 0.70 | 0.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.")] 

か(実際にはよりよい解決策である)@Martinの提案に若干の修正を加えてレンジを使用して:

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

".1"のようなさまざまなケースでこの正規表現は失敗します。正規表現を使用して数字を整理することはお勧めしません。正規表現は、一致する文字列(テキスト)入力を意味します。 RangeAttributeはこの問題を解決する最も適切な方法です。 Martinが言ったように@ JOBG –

+0

".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検証に邪魔になるものではありません。範囲検証ツールは、番号の検証後に起動します。私はあなたがjQueryのバグにつまずくかもしれないと思う

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

これは、開始ディジット0(0007、0500など)の文字列を検証しません – mko

0

:私はこれをお勧めしませんが、あなたは数バリデータを無効にすることができます。その検証は、検証属性に対して生成されたものと戦っています。

私は次のプロパティがあります。

このようなビューで使用
[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が受け入れられます。 .075の値では、「フィールド値は数値でなければなりません」という問題が発生しているようです。

this SO articleに基づいて、私はドキュメント準備に以下を追加しました:

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

今、私は私のエラーメッセージ、および唯一の予想(0.075が受理される)を取得します。

関連する問題