Validatori di valore min / max in asp.net mvc


106

La convalida utilizzando gli attributi in asp.net mvc è davvero piacevole. [Range(min, max)]Finora ho usato il validatore per controllare i valori, come ad esempio:

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

Tuttavia, ora devo controllare separatamente le condizioni min e max. Mi aspettavo di trovare attributi come questi:

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

Ci sono attributi predefiniti per scrivere questo? O come ottengo questo?


FluentValidation può essere un'altra soluzione per risolvere l'intervallo di date. Ecco la mia risposta a un'altra domanda che potrebbe essere utile .
— Zinov

Risposte:


48

Ecco come scriverei un validatore per 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'attributo MinValue dovrebbe essere più o meno lo stesso


Ok, mi aspettavo che esistessero, ma è abbastanza giusto scriverli. Grazie!
— stiank81

1
Solo per tua informazione, questo non convaliderebbe magicamente il modulo all'estremità di Javascript. Dovresti scrivere codice aggiuntivo + js per questo.
— basarat

3
@basarat in realtà non avrai bisogno di JS extra, la libreria di convalida jquery ha già funzioni per min / max, devi solo implementare l' IClientValidationinterfaccia sull'attributo sopra e restituire i valori corretti dal GetClientValidationRulesmetodo
— WickyNilliams

@WickyNilliams aggiungeresti una risposta con un esempio del tuo commento o CharlesOuellet modificheresti questa risposta con un esempio del commento di Wicky? Mi piacerebbe votare un esempio funzionante che includa la convalida lato client.
— Johnie Karr

@JohnieKarr Non lavoro più con .NET, quindi non posso fornire molte risposte. Detto questo, questa risposta di seguito sembra mostrare esattamente ciò che ho descritto
— WickyNilliams,

195

Non penso che esistano attributi di convalida min / max. Userei qualcosa di simile

[Range(1, Int32.MaxValue)]

per il valore minimo 1 e

[Range(Int32.MinValue, 10)]

per valore massimo 10


4
Mmm .. Non del tutto a mio agio con questo. A me sembra un po 'hacky.
— stiank81

21
È un po 'hacky .. ma a volte gli hack mi fanno sentire più a mio agio :)
— Guy

4
Questo approccio va bene fintanto che sovrascrivi il messaggio di errore predefinito o otterrai qualcosa di orribile come: "La proprietà x deve essere compresa tra -2e ^ 31-1 e 10".
— Nove code

2
Com'è questo hacky e scomodo? Mi sembra un ottimo approccio.

1
RangeAttributeha AllowMultiple = false, quindi questo non può essere compilato.
— Daniel Schilling

38

Un esempio completo di come questo potrebbe essere fatto. Per evitare di dover scrivere script di convalida lato client, è stato utilizzato il ValidationType = "range" esistente.

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
Bella risposta. Modificherei un po 'il messaggio di errore: "Immettere un valore maggiore o uguale a" è un messaggio di errore più corretto (grammaticalmente parlando).
— Tieson T.

0

jQuery Validation Plugin implementa già le regole min e max, dobbiamo solo creare un adattatore per il nostro attributo personalizzato:

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

Adattatore:

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

L'attributo Min sarebbe molto simile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.