Jaki jest najlepszy sposób dodania walidatora większego niż 0 po stronie klienta przy użyciu MVC i adnotacji danych?


94

Chciałbym móc zezwalać na przesyłanie formularza tylko wtedy, gdy wartość w pewnym polu jest większa niż 0. Pomyślałem, że może atrybut Zakres Mvc pozwoliłby mi wprowadzić tylko 1 wartość, aby oznaczać tylko wartość większą niż test, ale nie ma szczęścia, ponieważ nalega na wartości minimalne i maksymalne.

Jakieś pomysły, jak to osiągnąć?

Odpowiedzi:


245

Nie możesz przechowywać liczby większej niż to, co może pomieścić Twój bazowy typ danych, więc fakt, że atrybut Range wymaga wartości maksymalnej, jest bardzo dobrą rzeczą. Pamiętaj, że nie istnieje w prawdziwym świecie, więc poniższe powinny zadziałać:

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

Wadą tego podejścia jest to, że jeśli to potwierdza „abcd” to będzie wyświetlaczu: Please enter a value less than or equal to 2147483647.
Mike Cole,

nie powinno być możliwości wpisywania liter w polu numerycznym. Problem, który mam z tym polega na tym, że jeśli wpiszę 9999999999999999999, oznacza to, że mój numer jest za mały.
John Lord

16

Znalazłem tę odpowiedź, aby zweryfikować każdą dodatnią wartość dla zmiennej zmiennoprzecinkowej / podwójnej. Okazuje się, że te typy mają użyteczną stałą dla „Epsilon”

Reprezentuje najmniejszą dodatnią wartość System.Double, która jest większa od zera.

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

Epsilon jest w rzeczywistości funkcją rachunku różniczkowego. Jest to funkcja „limitu”, która w zasadzie mówi „najmniejszą liczbę, którą można odróżnić od zera”, dzięki czemu można otrzymać wpisy o wartości 0,00000001. Postawiłbym realistyczną liczbę na min.
John Lord

9

Możesz stworzyć swój własny walidator w ten sposób:

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

Następnie uwzględnij ten plik w swoim modelu i użyj go jako atrybutu w następujący sposób:

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

Często używam tego w walidacji listy rozwijanej. Zauważ, że ponieważ rozszerza on atrybut validationattribute, możesz dostosować komunikat o błędzie za pomocą parametru.


1
Skończyło się na użyciu tej odpowiedzi w innej sytuacji, która wymagała niestandardowego walidatora. Do walidacji prostej liczby całkowitej większej od zera należy użyć odpowiedzi Darina.
Zach

Właściwie też wolę jego metodę, ale ludzie, z którymi pracuję, mają problem z „arbitralnym ustalaniem granic” wartości.
John Lord

Ha, to wydaje się dziwne. Mogłem zobaczyć ich rozumowanie, gdyby prawidłowy zakres był mniejszy niż maksymalny rozmiar liczby całkowitej.
Zach

to bardziej problem z liczbami dziesiętnymi. Nie patrząc, jestem prawie pewien, że nie ma wbudowanej funkcji min lub max.
John Lord

To było dla mnie najlepsze rozwiązanie!
Dave Stuart
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.