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.