Cookie
Cookie

Reputation: 604

Range validation based on another property

Currently I have the model FooModel

public class FooModel
{
    [Range(0.001, 10000, ErrorMessage = "{0} must be a decimal/number between {1} and {2}.")]
    [RangeValidator("BarMax")]
    public decimal? Bar { get; set; }

    public decimal BarMax { get; set; }
}

Following suggestions I created a custom range validator

public class RangeValidator : ValidationAttribute
{
    private readonly string dependentPropery;

    public RangeValidator(string dependentpropery)
        : base()
    {
        this.dependentPropery = dependentpropery;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        System.Reflection.PropertyInfo property = validationContext.ObjectType.GetProperty(this.dependentPropery);
        if (property == null)
        {
            return new ValidationResult(string.Format("Unknown Property {0}", this.dependentPropery));
        }

        var value1 = property.GetValue(validationContext.ObjectInstance, null) as decimal?;
        if (!value1.HasValue)
        {
            return null;
        }

        decimal actualValue;

        if (value == null)
        {
            return new ValidationResult("Value can not be empty.");
        }

        decimal.TryParse(value.ToString(), out actualValue);
        if (actualValue <= 0)
        {
            return new ValidationResult(string.Format("{0} Value can not be empty.", this.dependentPropery));
        }

        return actualValue > value1.Value ? new ValidationResult(string.Format("Value cannot exceed {0} {1}.", this.dependentPropery, value1.Value)) : null;
    }
} 

Upvotes: 1

Views: 1325

Answers (1)

Slicksim
Slicksim

Reputation: 7172

You can't in the range attribute, but you could add the MVC Foolproof Validation library. Then you can set your range to be the max that your storage or primitive type will hold, then use foolproof's lessthan to constrain it to the BarMax property.

Upvotes: 2

Related Questions