Asp.net mvc'de min / maks değer doğrulayıcıları


106

Asp.net mvc'deki öznitelikleri kullanarak doğrulama gerçekten güzel. [Range(min, max)]Doğrulayıcıyı şu ana kadar değerleri kontrol etmek için kullanıyorum, örneğin:

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

Ancak - şimdi minimum ve maksimum koşulu ayrı ayrı kontrol etmem gerekiyor. Şunlar gibi özellikler bulmayı bekliyordum:

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

Bunu yazmak için önceden tanımlanmış nitelikler var mı? Veya bunu nasıl başarabilirim?


FluentValidation, tarih aralığını çözmek için başka bir çözüm olabilir. İşte yardımcı olabilecek başka bir soruya cevabım .
Zinov

Yanıtlar:


48

İşte MaxValue için bir doğrulayıcıyı nasıl yazacağım

public class MaxValueAttribute : ValidationAttribute
    {
        private readonly int _maxValue;

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

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

MinValue Özniteliği oldukça aynı olmalıdır


Tamam, var olmalarını bekliyordum, ama onları yazacak kadar adil. Teşekkürler!
stiank81

1
Bilginize, bu Javascript sonundaki formu sihirli bir şekilde doğrulamaz. Bunun için ek kod + js yazmanız gerekir.
başarat

3
@ basarat aslında fazladan JS'ye ihtiyacınız olmayacak, jquery doğrulama kitaplığının halihazırda min / max için işlevleri var, sadece IClientValidationyukarıdaki öznitelikte arayüzü uygulamanız ve GetClientValidationRulesyöntemden doğru değerleri döndürmeniz gerekiyor
WickyNilliams

@WickyNilliams, yorumunuzun bir örneğiyle bir yanıt ekler misiniz, yoksa CharlesOuellet bu yanıtı Wicky'nin yorumunun bir örneğiyle düzenler misiniz? İstemci tarafı doğrulamasını içeren bir çalışma örneğini desteklemek isterim.
Johnie Karr

@JohnieKarr Artık .NET ile çalışmıyorum, bu yüzden fazla bir cevap veremiyorum. Bununla birlikte, aşağıdaki cevap tam olarak anlattığım şeyi gösteriyor gibi görünüyor
WickyNilliams,

195

Min / maks doğrulama özniteliğinin var olduğunu sanmıyorum. Gibi bir şey kullanırdım

[Range(1, Int32.MaxValue)]

minimum değer 1 ve

[Range(Int32.MinValue, 10)]

maksimum değer için 10


4
Mmm .. Bununla pek rahat değilim. Bana biraz huysuz görünüyor.
stiank81

21
Biraz hileli ... ama bazen hackler beni daha rahat hissettiriyor :)
Guy

4
Bu yaklaşım, varsayılan hata mesajını geçersiz kıldığınız sürece iyidir, aksi takdirde "x özelliği -2e ^ 31-1 ile 10 arasında olmalıdır" gibi korkunç bir şey alırsınız.
Nine Tails

2
Bu nasıl düzensiz ve rahatsız edici? Bana güzel bir yaklaşım gibi görünüyor.

1
RangeAttributevardır AllowMultiple = false, bu nedenle bu derlenemez.
Daniel Schilling

38

Bunun nasıl yapılabileceğine dair eksiksiz bir örnek. İstemci tarafı doğrulama komut dosyaları yazmak zorunda kalmamak için, mevcut ValidationType = "aralık" kullanıldı.

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
Mükemmel cevap. Hata mesajını biraz değiştirirdim: "Şuna eşit veya daha büyük bir değer girin" daha (gramer açısından) doğru bir hata mesajıdır.
Tieson T.

0

jQuery Doğrulama Eklentisi zaten minimum ve maksimum kuralları uygulamaktadır, sadece özel niteliğimiz için bir adaptör oluşturmamız gerekiyor:

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

Adaptör:

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

Min niteliği çok benzer olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.