範囲データアノテーション属性を使用して、最小で最大の小数を指定する方法は?


150

価格の小数フィールドが0以上でなければならないことを指定したいのですが、最大値を強制したくありません。

これが私が今まで持っているものです...これを行う正しい方法が何であるかはわかりません。

[Range(typeof(decimal), "0", "??"] public decimal Price { get; set; }

確かにこれがデータベースに入る場合、選択したデータベースタイプに基づいて最大許容数を指定する必要がありますか?そうしないと、この数を超えると厄介な例外が発生します
Coops

回答:


226

このようなものはどうですか:

[Range(0.0, Double.MaxValue, ErrorMessage = "The field {0} must be greater than {1}.")]

それはあなたが探していることをするはずで、文字列の使用を避けることができます。


1
Int32(Int32.MaxValue)で使用しましたが、問題ありません。
Bronek 2013年

15
しかし、それは愚かな検証メッセージを示しています:(The field Fixed price discount must be between 0.01 and 1.79769313486232E+308.
Piotr Kula 2013

16
@ppumkinAnvändErrorMessage、つまり[Range(0.0、Double.MaxValue、ErrorMessage = "your error here")]
flafffl

ジェイコブに感謝します。正解です。
pimbrouwers 2015

1
@ppumkinはDataAnnotationsModelValidatorクラスを継承してエラーメッセージをカスタマイズします
Alexander

91

文字列の見栄えが気になる場合は、次のようにします。

    [Range(0, Double.PositiveInfinity)]

これには、デフォルトのエラーメッセージが表示されます。

フィールドSuchAndSuchは0から無限大の間でなければなりません。


11
これはここでのIMHOの最良の答えです。拡張機能、一見ランダムな文字列/数値、カスタムコード、合理的に実用的なエラーメッセージはありません。
Vitani 2016年

42

最大値を手動で入力する以外に選択肢がないようです。指定する必要のないタイプのオーバーロードがあるといいのですが。

[Range(typeof(decimal), "0", "79228162514264337593543950335")]
public decimal Price { get; set; }

14
このコードはひどく見えます。nuget経由で@Nicolai Schlenzigが回答したように、dataannotationsextensions.org を使用することを勧めします。使用[Min(0)]-これには、より良い検証メッセージもあります。私はあなたの答えを更新することをお勧めします
Piotr Kula 2013

OPが彼の心を変えていないので、ここでベストアンサーと同じになるように更新しましたlol
Worthy7

上記の回答(@Jordanおよび@Jacob)の方がはるかに適切です。特に私達が価格について話しているので。多くの場合、取引は10進数の値で行われる必要があることを理解していますが、価格を1.234ドルまたは少なくともユーザーに見せたくない場合がほとんどありません。
Anastasios Selmanis 2017年

@AnastasiosSelmanis、私はあなたに同意します。「価格は1.234ドルではありません」と言ったときにその部分を期待します。あなたはUSDを想定していますが、それでも、これを外国為替に使用すると(ここではOPで言及されていませんが)、USDはより多くの小数になります。=)
RoLYroLLは

35

以下を使用できます。

[Min(0)]

これにより、必要な最小値0(ゼロ)が課され、最大値は課されません。

これを使用するには、DataAnnotationsExtensionsが必要です


8
いいえ、これは正しいとは思いません。これは、Data Annotations Extensions dataannotationsextensions.orgからの標準MVC3フレームワークの一部ではありません。MSDNリンクを提供してください。
バーニーホワイト

1
いいえ-間違いなくMVC 3の一部ではありません:(ただし、このライブラリは何らかの方法で拡張できる優れた拡張機能です:)
Piotr Kula

1
MVC3の一部ではありませんが、重要ではありません。クライアント側で検証が必要な場合は、DataAnnotationsExtensions.MVC3パッケージを使用するだけです。これら2つのパッケージはnugetで入手できます。ばかげたエラーメッセージがないか、正の整数または10進数(かなり一般的)を検証するたびにエラーメッセージを再定義する必要がないので、これが最良のアプローチだと思います。
ゲンティアン2014年

21

価格で作業している場合は、1兆ドル以上の費用はかかりません。

私は使用します:

[Range(0.0, 1000000000000)]

または、本当に必要な場合は、Decimal.MaxValue(カンマなしで)の値を貼り付けます。79,228,162,514,264,337,593,543,950,335

ジンバブエ出身でない場合は、どちらを使用しても問題ありません。


7
なぜ[Range(0.0,Decimal.MaxValue)]ですか?
協同組合2013年

4
コンパイルしないでください。Decimal.MaxValueは定数ではありません。
ジョンファレル2013年

その定数は迷惑である、エラーテキストのリソースファイルを参照することは容易にノーです
小屋

3
ここで、通貨は円ではなく、ドルなどであると仮定しています。
フレッド

1
@jfar Decimal.MaxValueは定数です。Rangeに小数に対応するためのオーバーロードがないだけです。
ΕГИІИО

11

カスタム検証を使用できます。

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public int IntValue { get; set; }

    [CustomValidation(typeof(ValidationMethods), "ValidateGreaterOrEqualToZero")]
    public decimal DecValue { get; set; }

検証メソッドタイプ:

public class ValidationMethods
{
    public static ValidationResult ValidateGreaterOrEqualToZero(decimal value, ValidationContext context)
    {
        bool isValid = true;

        if (value < decimal.Zero)
        {
            isValid = false;
        }

        if (isValid)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(
                string.Format("The field {0} must be greater than or equal to 0.", context.MemberName),
                new List<string>() { context.MemberName });
        }
    }
}

2

私はこのようなものを試してみました:

[Range(typeof(decimal), ((double)0).ToString(), ((double)decimal.MaxValue).ToString(), ErrorMessage = "Amount must be greater than or equal to zero.")]

ただし、これを行う際の問題は、コンパイラが定数式を必要とすること((double)0).ToString()です。コンパイラはなり取ります

[Range(0d, (double)decimal.MaxValue, ErrorMessage = "Amount must be greater than zero.")]

これに反対票を投じた人は誰でも、私のソリューションが貧弱または役に立たないと思う理由を説明してくれませんか?何も説明せずに投票するだけではまったく役に立たないからです。
David T. Macknet 2016

エラーメッセージには、「以上」と表示されます。
ΕГИІИО

良いキャッチ。追加しました。
David T. Macknet

1

範囲を使用して

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

[Range(typeof(Decimal),"0.0", "1000000000000000000"]

それが役に立てば幸い



0

私はかけることになりdecimal.MaxValue.ToString()、これは、それは上限がないと同等ですdecmialタイプのための効果的な天井からです。


4
問題はそれが定数ではないことです。このエラーが発生します:属性引数は、定数式、typeof式、または属性パラメーター型の配列作成式である必要があります
user169867

以下に指摘したように、どうやら誰かからは評価されなかったようです。
David T. Macknet 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.