web-dev-qa-db-ja.com

MVC 4-DataAnnotations-タイプの検証

次のコードが機能しています

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

ページがPrice = EMPTYフィールドで送信されると、エラーメッセージは「Price is required。」になります。価格= 9999以上のエラーメッセージは「価格xx.xx」です。

ただし、「aaaa」と入力すると、エラーメッセージは"フィールドproductPriceは数値でなければなりません。"

入力が正しくない場合、メッセージをどのように変更できますか?のように:「価格は1から9999までの10進数/数値でなければなりません。

---- UPDATE:----以下のコードは

NULL、10進数ではなく、範囲内ですが、「。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
Ravi Ram

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

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

データアノテーション拡張機能を試すこともできます: http://dataannotationsextensions.org/Home/Wiki

または、次のような独自の実装を記述します。 https://github.com/srkirkland/DataAnnotationsExtensions/blob/master/DataAnnotationsExtensions/DigitsAttribute.cs

[〜#〜] update [〜#〜]REGEX付き($ 9,999.99に一致| $ 0.70 | .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を使用します(実際にはより良い解決策です)。

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

まず、Range属性を次のように変更したいと思います。

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

MSDNによると これはRangeAttributeを使用する有効な方法です。

第二:

「フィールドproductPriceは数値でなければなりません。」

これは実際には目立たないクライアント側のJavaScript検証です。数値が検証されると、範囲バリデーターが起動します。これはお勧めしませんが、数値バリデーターを無効にすることができます。

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

私はあなたが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が受け入れられます。値が.075の場合、「フィールド値は数値である必要があります」と同じ問題が発生します。

this SO article に基づいて、ドキュメントに次の内容を追加しました:

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

今、私は自分のエラーメッセージだけを受け取り、期待されたときだけです(.075は受け入れられます)。

0
Elton