开发者

Range annotation between nothing and 100?

开发者 https://www.devze.com 2023-01-01 07:01 出处:网络
I have a [Range] annotation that looks like this: [Range(0, 100)] public int AvailabilityGoal { get; set; }

I have a [Range] annotation that looks like this:

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

My webpage looks like this:

<%=Html.TextBoxFor(u => u.Group.AvailabilityGoal)%>
开发者_StackOverflow中文版

It works as it should, I can only enter values between 0 and 100 but I also want the input box to be optional, the user shouldn't get an validation error if the input box is empty. This has nothing to do with the range but because the type is an integer. If the user leaves it empty it should make AvailabilityGoal = 0 but I don't want to force the user to enter a zero.

I tried this but it (obviously) didn't work:

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

Is it possible to solve this with Data Annotations or in some other way?

Thanks in advance.

Bobby


You shouldn't have to change the [Range] attribute, as [Range] and other built-in DataAnnotations validators no-op when given an empty value. Just make the property itself of type int? rather than int. Non-nullable ValueType properties (like int) are always automatically required.


I guess you could override the Range object and add this behaviour.

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


This seems to work as (pretty) well:

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

The lower limit is not checked upon. Not so handy if you want to check null || >= 0. Off course server-side validation goes hand-in-hand with client-side validation where this (< 0) can be checked upon.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号