Який найкращий спосіб додати валідатор більше 0 на стороні клієнта за допомогою MVC та анотації даних?


94

Я хотів би мати можливість дозволити форму для подання лише у тому випадку, якщо значення в певному полі перевищує 0. Я думав, можливо, атрибут Mvc Range дозволить мені ввести лише 1 значення для позначення лише більшого, ніж тест, але там не пощастило, оскільки він наполягає на мінімальних та максимальних значеннях.

Будь-які ідеї, як цього можна досягти?

Відповіді:


245

Ви не можете зберегти число, більше за те, що міг би містити ваш базовий тип даних, тому той факт, що атрибут Range вимагає максимальне значення, є дуже гарною річчю. Пам’ятайте, що цього не існує в реальному світі, тому має працювати наступне:

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

Недоліком цього підходу є те , що , якщо він перевіряє «ABCD» це буде дисплей: Please enter a value less than or equal to 2147483647.
Mike Cole

ви не зможете вводити літери в числове поле. Проблема у мене з цим полягає в тому, що якщо я вводжу 9999999999999999999, це означає, що мій номер замалий.
Джон Лорд,

16

Я знайшов цю відповідь, намагаючись перевірити будь-яке позитивне значення для float / double. Виявляється, ці типи мають корисну константу для "Епсилон"

Представляє найменшу позитивну систему. Подвоєне значення більше нуля.

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

Епсилон насправді є функцією числення. Це "обмежувальна" функція, яка в основному говорить "найменше число, яке можна відрізнити від нуля", щоб у вас могли з'явитися записи .00000001. Я б поставив реалістичне число на мін.
Джон Лорд

9

Ви можете створити власний валідатор таким чином:

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

Потім включіть цей файл у свою модель і використовуйте його як такий атрибут:

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

Я зазвичай використовую це під час перевірки спадного меню. Зверніть увагу: оскільки він розширює атрибут перевірки, ви можете налаштувати повідомлення про помилку за допомогою параметра.


1
У підсумку я використав цю відповідь для іншої ситуації, яка вимагала спеціального валідатора. Для простого цілого числа, що перевищує нуль, слід використовувати відповідь Даріна.
Зак

Я насправді також віддаю перевагу його методу, але люди, з якими я працюю, мають проблему з "довільним встановленням обмежень" на цінності.
Джон Лорд,

Ха, це здається дивним. Я міг бачити їх міркування, якщо дійсний діапазон був меншим від максимального цілочисельного розміру.
Зак

це більше проблема з десятковими знаками. Не дивлячись, я майже впевнений, що в людині немає вбудованої функції min або max.
Джон Лорд,

Це було найкраще рішення для мене!
Дейв Стюарт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.