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.