Аннотации диапазона между ничего и 100?

У меня есть аннотация [Range], которая выглядит так:

[Range(0, 100)]
public int AvailabilityGoal { get; set; }

Моя веб-страница выглядит следующим образом:

<%=Html.TextBoxFor(u => u.Group.AvailabilityGoal)%>

Он работает так, как должен, я могу вводить только значения от 0 до 100, но я также хочу, чтобы поле ввода было необязательным, пользователь не должен получать ошибку проверки, если поле ввода пуст. Это не имеет ничего общего с диапазоном, но поскольку тип является целым числом. Если пользователь оставляет его пустым, он должен сделать AvailabilityGoal = 0, но я не хочу заставлять пользователя вводить нуль.

Я пробовал это, но он (очевидно) не работал:

[Range(typeof(int?), null, "100")]

Можно ли разрешить это с помощью аннотаций данных или каким-либо другим способом?

Спасибо заранее.

Бобби

Ответы

Ответ 1

Вам не нужно менять атрибут [Range], так как [Range] и другие встроенные в DataAnnotations валидаторы no-op при задании пустого значения. Просто создайте свойство самого типа int?, а не int. Неизменяемые свойства ValueType (например, int) всегда требуются автоматически.

Ответ 2

Я думаю, вы могли бы переопределить объект Range и добавить это поведение.

public class OptionalRange : RangeAttribute {
    public override bool IsValid(object value) {
        if (value == null || (int)value == 0) return true;
        return base.IsValid(value);
    }
}

Ответ 3

Это, кажется, работает (довольно) хорошо:

[Range(Double.NaN, 20)]
public byte? Amount { get; set; }

Нижний предел не проверяется. Не очень удобно, если вы хотите проверить null || >= 0 null || >= 0. Конечно, проверка на стороне сервера идет рука об руку с проверкой на стороне клиента, где можно проверить это (<0).