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ąć?

jaffa
źródło

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; }
Darin Dimitrov
źródło
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; }
Phil
źródło
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.

John Lord
źródło
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