114 votes

Validateurs de valeurs Min/Max dans asp.net mvc

La validation à l'aide d'attributs dans asp.net mvc est vraiment bien. J'ai utilisé le [Range(min, max)] validateur jusqu'à présent pour vérifier les valeurs, comme par exemple :

[Range(1, 10)]
public int SomeNumber { get; set; }

Cependant, j'ai maintenant besoin de vérifier les conditions min et max séparément. Je m'attendais à trouver des attributs comme ceux-ci :

[MinValue(1, "Value must be at least 1")]
[MaxValue(10, "Value can't be more than 10")]
public int SomeNumber { get; set; }

Existe-t-il des attributs prédéfinis pour écrire cela ? Ou comment puis-je y parvenir ?

0 votes

FluentValidation peut être une autre solution pour résoudre l'intervalle de dates. Voici ma réponse à une autre question qui pourrait être utile .

209voto

Guy Points 1383

Je ne pense pas que les attributs de validation min/max existent. J'utiliserais quelque chose comme

[Range(1, Int32.MaxValue)]

pour la valeur minimale 1 et

[Range(Int32.MinValue, 10)]

pour une valeur maximale de 10

4 votes

Mmm Pas tout à fait à l'aise avec ça. Ca me semble un peu bidon.

22 votes

C'est un peu bricolé mais parfois les bricolages me permettent de me sentir plus à l'aise :)

0 votes

Nous l'avons fait, mais nous avons eu des problèmes dès que nous avons eu affaire à d'énormes valeurs à virgule flottante.

53voto

Charles Ouellet Points 2511

Voici comment j'écrirais un validateur pour MaxValue

public class MaxValueAttribute : ValidationAttribute
    {
        private readonly int _maxValue;

        public MaxValueAttribute(int maxValue)
        {
            _maxValue = maxValue;
        }

        public override bool IsValid(object value)
        {
            return (int) value <= _maxValue;
        }
    }

L'attribut MinValue doit être à peu près le même.

0 votes

Ok, je m'attendais à ce qu'ils existent, mais c'est assez juste de les écrire. Merci !

1 votes

Pour votre information, cela ne validera pas magiquement le formulaire du côté Javascript. Vous devrez écrire du code supplémentaire + js pour cela.

3 votes

@basarat en fait, vous n'aurez pas besoin de JS supplémentaire, la bibliothèque de validation jquery possède déjà des fonctions pour min/max, vous devez juste implémenter la fonction IClientValidation sur l'attribut ci-dessus et renvoie les valeurs correctes de l'interface GetClientValidationRules méthode

38voto

Mario Points 161

Un exemple complet de la façon dont cela pourrait être fait. Pour éviter d'avoir à écrire des scripts de validation côté client, le ValidationType = "range" existant a été utilisé.

public class MinValueAttribute : ValidationAttribute, IClientValidatable
{
    private readonly double _minValue;

    public MinValueAttribute(double minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;  
    }

    public MinValueAttribute(int minValue)
    {
        _minValue = minValue;
        ErrorMessage = "Enter a value greater than or equal to " + _minValue;
    }

    public override bool IsValid(object value)
    {
        return Convert.ToDouble(value) >= _minValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = ErrorMessage;
        rule.ValidationParameters.Add("min", _minValue);
        rule.ValidationParameters.Add("max", Double.MaxValue);
        rule.ValidationType = "range";
        yield return rule;
    }

}

8 votes

Excellente réponse. Je modifierais un peu le message d'erreur : "Entrez une valeur supérieure ou égale à " est un message d'erreur plus correct (grammaticalement parlant).

0voto

Benas Radzevicius Points 277

Le plugin de validation jQuery implémente déjà les règles min et max, nous devons juste créer un adaptateur pour notre attribut personnalisé :

public class MaxAttribute : ValidationAttribute, IClientValidatable
{
    private readonly int maxValue;

    public MaxAttribute(int maxValue)
    {
        this.maxValue = maxValue;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();

        rule.ErrorMessage = ErrorMessageString, maxValue;

        rule.ValidationType = "max";
        rule.ValidationParameters.Add("max", maxValue);
        yield return rule;
    }

    public override bool IsValid(object value)
    {
        return (int)value <= maxValue;
    }
}

Adaptateur :

$.validator.unobtrusive.adapters.add(
   'max',
   ['max'],
   function (options) {
       options.rules['max'] = parseInt(options.params['max'], 10);
       options.messages['max'] = options.message;
   });

L'attribut Min serait très similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X