Quelle est la meilleure façon d'ajouter un validateur supérieur à 0 côté client à l'aide de MVC et d'annotation de données?

92

J'aimerais pouvoir autoriser la soumission d'un formulaire uniquement si la valeur d'un certain champ est supérieure à 0. Je pensais que l'attribut Mvc Range me permettrait peut-être de saisir une seule valeur pour signifier uniquement un test supérieur à, mais pas de chance car il insiste sur les valeurs minimum et maximum.

Des idées comment cela peut être réalisé?

Jaffa
la source

Réponses:

241

Vous ne pouvez pas stocker un nombre plus grand que ce que votre type de données sous-jacent pourrait contenir, de sorte que le fait que l'attribut Range nécessite une valeur maximale est une très bonne chose. N'oubliez pas que cela n'existe pas dans le monde réel, donc ce qui suit devrait fonctionner:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }
Darin Dimitrov
la source
L'inconvénient de cette approche est que si elle valide « ABCD » il va afficher: Please enter a value less than or equal to 2147483647.
Mike Cole
vous ne devriez pas pouvoir saisir de lettres dans un champ numérique. Le problème que j'ai avec cela est que si j'entre 9999999999999999999, cela indique que mon numéro est trop petit.
John Lord le
12

J'ai trouvé cette réponse cherchant à valider toute valeur positive pour un float / double. Il s'avère que ces types ont une constante utile pour 'Epsilon'

Représente la plus petite valeur System.Double positive supérieure à zéro.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }
Phil
la source
Epsilon est en fait une fonction de calcul. C'est une fonction «limite» qui dit essentiellement «le plus petit nombre qui peut être distingué de zéro», donc vous pourriez vous retrouver avec des entrées de .00000001. Je mettrais un nombre réaliste sur le min.
John Lord
9

Vous pouvez créer votre propre validateur comme ceci:

    public class RequiredGreaterThanZero : ValidationAttribute
{
    /// <summary>
    /// Designed for dropdowns to ensure that a selection is valid and not the dummy "SELECT" entry
    /// </summary>
    /// <param name="value">The integer value of the selection</param>
    /// <returns>True if value is greater than zero</returns>
    public override bool IsValid(object value)
    {
        // return true if value is a non-null number > 0, otherwise return false
        int i;
        return value != null && int.TryParse(value.ToString(), out i) && i > 0;
    }
}

Incluez ensuite ce fichier dans votre modèle et utilisez-le comme attribut comme celui-ci:

    [RequiredGreaterThanZero]
    [DisplayName("Driver")]
    public int DriverID { get; set; }

J'utilise couramment ceci lors de la validation de la liste déroulante. Notez que parce qu'il étend l'attribut de validation, vous pouvez personnaliser le message d'erreur avec un paramètre.

John Lord
la source
1
J'ai fini par utiliser cette réponse pour une autre situation qui nécessitait un validateur personnalisé. Pour la validation d'un entier simple supérieur à zéro, la réponse de Darin doit être utilisée.
Zach
En fait, je préfère aussi sa méthode, mais les gens avec qui je travaille ont un problème avec "fixer arbitrairement des limites" aux valeurs.
John Lord
Ha, cela semble étrange. Je pouvais voir leur raisonnement si la plage valide était inférieure à la taille entière maximale.
Zach
c'est plus un problème avec les décimales. Sans regarder, je suis presque sûr que l'on n'a pas de fonction min ou max intégrée.
John Lord
C'était la meilleure solution pour moi!
Dave Stuart