Reputation: 3803
I have a Datetime field in my Model and need to validate it so that when it is created it has to fall between Now and 6 Years Prior. I have tried using range like
[Range(DateTime.Now.AddYears(-6), DateTime.Now)]
public DateTime Datetim { get; set; }
But this throws an error cannot convert system datetime to double. Can anyone suggest a workaround to this in the model itself?
Upvotes: 27
Views: 40118
Reputation: 1277
jQuery validation does not work with RangeAttribute
, per Rick Anderson. This renders the selected solution incorrect if you're using ASP.NET MVC 5's built-in jQuery validation.
Instead, see the below code from this answer.
public class WithinSixYearsAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
value = (DateTime)value;
// This assumes inclusivity, i.e. exactly six years ago is okay
if (DateTime.Now.AddYears(-6).CompareTo(value) <= 0 && DateTime.Now.CompareTo(value) >= 0)
{
return ValidationResult.Success;
}
else
{
return new ValidationResult("Date must be within the last six years!");
}
}
}
And it's implemented like any other attribute.
[WithinSixYears]
public DateTime SixYearDate { get; set; }
Upvotes: 5
Reputation: 10427
Use this attribute:
public class CustomDateAttribute : RangeAttribute
{
public CustomDateAttribute()
: base(typeof(DateTime),
DateTime.Now.AddYears(-6).ToShortDateString(),
DateTime.Now.ToShortDateString())
{ }
}
Upvotes: 37
Reputation: 56698
Even though there is an overload for Range
attribute that accepts type and boundary values of that type and allows something like this:
[Range(typeof(DateTime), "1/1/2011", "1/1/2012", ErrorMessage="Date is out of Range")]
what you are trying to achieve is not possible using this attribute. The problem is that attributes accept only constants as parameters. Obviously neither DateTime.Now
nor DateTime.Now.AddYears(-6)
are constants.
However you can still do this creating your own validation attribute:
public class DateTimeRangeAttribute : ValidationAttribute
{
//implementation
}
Upvotes: 36