web-dev-qa-db-fra.com

Quel est le meilleur moyen d'ajouter un validateur supérieur à 0 côté client à l'aide de MVC et des annotations de données?

J'aimerais pouvoir autoriser l'envoi d'un formulaire uniquement si la valeur d'un champ donné est supérieure à 0. Je pensais que l'attribut Mvc Range me permettrait peut-être de ne saisir qu'une valeur pour signifier uniquement un test supérieur à test, mais pas de chance car il insiste sur les valeurs Minimum ET Maximum.

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

74
jaffa

Vous ne pouvez pas stocker un nombre plus grand que ce que votre type de données sous-jacent pourrait contenir. Par conséquent, le fait que l'attribut Range nécessite une valeur max est une très bonne chose. Rappelez-vous que n’existe pas dans le monde réel, les éléments suivants devraient donc fonctionner:

[Range(1, int.MaxValue, ErrorMessage = "Please enter a value bigger than {1}")]
public int Value { get; set; }
201
Darin Dimitrov

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 positive System.Double supérieure à zéro.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }
8
Phil

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;
    }
}

Ensuite, incluez ce fichier dans votre modèle et utilisez-le comme un attribut comme celui-ci:

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

Je l'utilise couramment lors de la validation par liste déroulante.

3
John Lord