MVC ve veri açıklamasını kullanarak istemci tarafında 0'dan büyük bir doğrulayıcı eklemenin en iyi yolu nedir?


95

Yalnızca belirli bir alandaki değer 0'dan büyükse bir formun gönderilmesine izin verebilmek istiyorum. Mvc Range özniteliğinin, testten daha büyük olduğunu belirtmek için yalnızca 1 değer girmeme izin verebileceğini düşündüm, ancak Minimum VE Maksimum değerlerde ısrar ettiği için orada şans yok.

Bunun nasıl başarılabileceği hakkında bir fikriniz var mı?

Yanıtlar:


246

Temel veri türünüzün tutabileceğinden daha büyük bir sayı saklayamazsınız, bu nedenle Range özniteliğinin maksimum değer gerektirmesi çok iyi bir şeydir. Bunun gerçek dünyada olmadığını unutmayın , bu nedenle aşağıdakiler çalışmalıdır:

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

Bu yaklaşımın dezavantajı doğrular eğer ekrana gidiyor "abcd" olmasıdır: Please enter a value less than or equal to 2147483647.
Mike Cole

sayısal bir alana harf girmemelisiniz. Bununla ilgili sorunum, 9999999999999999999 girersem numaramın çok küçük olduğunu söylüyor.
John Rab

16

Bir float / double için herhangi bir pozitif değeri doğrulamak isteyen bu cevabı buldum. Bu türlerin 'Epsilon' için kullanışlı bir sabiti olduğu ortaya çıktı.

Sıfırdan büyük olan en küçük pozitif System.Double değerini temsil eder.

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

Epsilon aslında bir kalkülüs fonksiyonudur. Bu, temelde "sıfırdan ayırt edilebilen en küçük sayı" diyen bir "sınır" işlevidir, böylece .00000001 girdileriyle sonlandırabilirsiniz. Min. İçin gerçekçi bir sayı koyardım.
John Lord

9

Kendi doğrulayıcınızı şu şekilde oluşturabilirsiniz:

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

Ardından bu dosyayı modelinize ekleyin ve aşağıdaki gibi bir öznitelik olarak kullanın:

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

Bunu genellikle açılır menü doğrulamasında kullanıyorum. Doğrulama özniteliğini genişlettiği için hata mesajını bir parametre ile özelleştirebileceğinizi unutmayın.


1
Bu yanıtı, özel bir doğrulayıcı gerektiren başka bir durum için kullandım. Sıfırdan büyük basit tamsayı için, Darin'in cevabı kullanılmalıdır.
Zach

Aslında onun yöntemini de tercih ediyorum, ancak birlikte çalıştığım kişilerin değerlere "keyfi olarak sınırlar koyma" ile ilgili bir sorunu var.
John Lord

Ha, bu garip görünüyor. Geçerli aralık maksimum tamsayı boyutundan küçükse, nedenlerini görebiliyordum.
Zach,

daha çok ondalık sayılarla ilgili bir sorun. Bakmadan, yerleşik bir minimum veya maksimum işlevi olmadığından oldukça eminim.
John Lord

Bu benim için en iyi çözümdü!
Dave Stuart
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.