Как лучше всего добавить валидатор больше 0 на стороне клиента с помощью MVC и аннотации данных?

95

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

Есть идеи, как этого можно достичь?

Яффо
источник

Ответы:

246

Вы не можете хранить число больше, чем может содержать ваш базовый тип данных, поэтому тот факт, что атрибут 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.
Майк Коул
у вас не должно быть возможности вводить буквы в числовое поле. Проблема, с которой я столкнулся, заключается в том, что если я ввожу 9999999999999999999, он говорит, что мой номер слишком мал.
Джон Лорд
16

Я нашел этот ответ, чтобы проверить любое положительное значение для float / double. Оказывается, у этих типов есть полезная константа для "Эпсилона".

Представляет наименьшее положительное значение System.Double, которое больше нуля.

    [Required]
    [Range(double.Epsilon, double.MaxValue)]
    public double Length { get; set; }
Фил
источник
Эпсилон на самом деле является функцией исчисления. Это «предельная» функция, которая в основном говорит «наименьшее число, которое можно отличить от нуля», чтобы вы могли получить записи 0,0000000001. Я бы поставил реальную цифру на мин.
Джон Лорд
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
В итоге я использовал этот ответ для другой ситуации, для которой требовался собственный валидатор. Для простого целого числа больше нуля следует использовать ответ Дарина.
Зак
На самом деле я тоже предпочитаю его метод, но у людей, с которыми я работаю, есть проблема с «произвольной установкой ограничений» на значения.
Джон Лорд
Ха, это кажется странным. Я мог бы понять их рассуждения, если бы допустимый диапазон был меньше максимального целочисленного размера.
Зак
это больше проблема с десятичными знаками. Не глядя, я почти уверен, что в нем нет встроенных функций
Джон Лорд
Для меня это было лучшим решением!
Дэйв Стюарт