Flood Gravemind
Flood Gravemind

Reputation: 3803

Is there a RangeAttribute for DateTime?

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

Answers (3)

Sinjai
Sinjai

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

Ahmed KRAIEM
Ahmed KRAIEM

Reputation: 10427

Use this attribute:

public class CustomDateAttribute : RangeAttribute
{
  public CustomDateAttribute()
    : base(typeof(DateTime), 
            DateTime.Now.AddYears(-6).ToShortDateString(),
            DateTime.Now.ToShortDateString()) 
  { } 
}

Upvotes: 37

Andrei
Andrei

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

Related Questions