Reputation: 604
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
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