web-dev-qa-db-fra.com

Comment spécifier une décimale minimale mais non maximale à l'aide de l'attribut d'annotation de données de plage?

Je voudrais spécifier qu'un champ décimal pour un prix doit être> = 0 mais je ne veux pas vraiment imposer une valeur max.

Voici ce que j'ai jusqu'à présent ... Je ne sais pas quelle est la bonne façon de procéder.

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

Eh bien, il semble qu’il n’y ait pas d’autre choix que de saisir manuellement la valeur maximale. J'espérais qu'il y avait un type de surcharge pour lequel vous n'aviez pas besoin de le spécifier.

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

Que diriez-vous quelque chose comme ça:

[Range(0.0, Double.MaxValue)]

Cela devrait faire ce que vous cherchez et vous pouvez éviter d’utiliser des chaînes.

185
Jacob

Si vous êtes préoccupé par la ficelle Nice, vous pouvez le faire:

    [Range(0, Double.PositiveInfinity)]

Cela aura un message d'erreur par défaut de:

Le champ SuchAndSuch doit être compris entre 0 et Infinity. 

69
Jordan

Vous pouvez utiliser:

[Min(0)]

Cela imposera une valeur minimale requise de 0 (zéro) et aucune valeur maximale.

Vous avez besoin de DataAnnotationsExtensions pour l'utiliser.

30
Nicolai Schlenzig

Si vous travaillez avec des prix, je suis sûr que vous pouvez supposer que rien ne coûtera plus de 1 billion de dollars.

J'utiliserais:

[Range(0.0, 1000000000000)]

Ou, si vous en avez vraiment besoin, il vous suffit de coller la valeur de Decimal.MaxValue (sans les virgules): 79 228,162,514,264,337,593,543,950,335

L'un ou l'autre de ceux-ci fonctionnera bien si vous n'êtes pas du Zimbabwe.

19
John Farrell

Vous pouvez utiliser la validation personnalisée:

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

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

Type de méthodes de validation:

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
Erikas Pliauksta

[Plage (0.01,100000000, ErrorMessage = "Le prix doit être supérieur à zéro!")]

1
Sohail Akhter

Je mettrais decimal.MaxValue.ToString() puisqu'il s'agit du plafond effectif pour le type décimal, cela équivaut à ne pas avoir de limite supérieure.

1
Dr Herbie

J'allais essayer quelque chose comme ça:

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

Le problème avec cela, cependant, est que le compilateur veut une expression constante qui interdit ((double)0).ToString(). Le compilateur will take

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

en utilisant Range avec

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

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

J'espère que ça va aider

0
Abi