Диапазон аннотации между ничем и 100? - PullRequest
14 голосов
/ 26 мая 2010

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

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

Моя веб-страница выглядит так:

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

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

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

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

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

Заранее спасибо.

Бобби

Ответы [ 3 ]

22 голосов
/ 26 мая 2010

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

5 голосов
/ 26 мая 2010

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

public class OptionalRange : RangeAttribute {
    public override bool IsValid(object value) {
        if (value == null || (int)value == 0) return true;
        return base.IsValid(value);
    }
}
0 голосов
/ 16 января 2019

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

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

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

...