web-dev-qa-db-ja.com

範囲データ注釈属性を使用して最小小数を指定し、最大小数を指定しない方法は?

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

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

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

最大値を手動で入力する以外に選択肢はないようです。私はあなたがそれを指定する必要のないある種のオーバーロードがあることを望んでいました。

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

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

[Range(0.0, Double.MaxValue)]

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

196
Jacob

あなたがニースに見える文字列について心配している場合、これを行うことができます:

    [Range(0, Double.PositiveInfinity)]

これにはデフォルトのエラーメッセージがあります:

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

72
Jordan

次を使用できます。

[Min(0)]

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

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

31

価格を扱っているのであれば、1兆ドル以上の費用は一切かかりません。

私は使用します:

[Range(0.0, 1000000000000)]

または、本当に必要な場合は、Decimal.MaxValueの値をカンマなしで貼り付けてください:79,228,162,514,264,337,593,543,950,335

ジンバブエ出身でない場合、これらのいずれかがうまく機能します。

19
John Farrell

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

    [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 });
        }
    }
}
10

私はこのようなことをしようとしていた:

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

ただし、これを行う場合の問題は、コンパイラが((double)0).ToString()を許可しない定数式を必要とすることです。コンパイラwill take

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

範囲の使用

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

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

それが役立つことを願っています

1
Abi

[Range(0.01,100000000、ErrorMessage = "価格はゼロより大きくなければなりません!")]

1
Sohail Akhter

これはdecimal.MaxValue.ToString()を使用します。これは、これが10進数型の有効な上限であるため、上限がないことと同等です。

1
Dr Herbie