Manoj Maximum
Manoj Maximum

Reputation: 43

mvc-model date range annotation dynamic dates

with reference to this thread in stackoverflow

[Range(typeof(DateTime), "1/2/2004", "3/4/2004",
    ErrorMessage = "Value for {0} must be between {1} and {2}")]
public DateTime EventOccurDate{get;set;}

I tried to add some dynamic dates into my model's date range validator as:

private string currdate=DateTime.Now.ToString();
private string futuredate=DateTime.Now.AddMonths(6).ToString();

[Range(typeof(DateTime),currdate,futuredate,
    ErrorMessage = "Value for {0} must be between {1} and {2}")]
public DateTime EventOccurDate{get;set;}

But Error Occurs.Is there no way to set dynamic date range validation in MVC?

Upvotes: 1

Views: 2762

Answers (1)

Darin Dimitrov
Darin Dimitrov

Reputation: 1038730

You cannot use dynamic values in attributes because they are metadata that is generated at compile-time. One possibility to achieve this is to write a custom validation attribute or use Fluent Validation which allows for expressing more complex validation scenarios using a fluent expressions.

Here's an example of how such custom validation attribute might look like:

public class MyValidationAttribute: ValidationAttribute
{
    public MyValidationAttribute(int monthsSpan)
    {
        this.MonthsSpan = monthsSpan;
    }

    public int MonthsSpan { get; private set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            var date = (DateTime)value;
            var now = DateTime.Now;
            var futureDate = now.AddMonths(this.MonthsSpan);

            if (now <= date && date < futureDate)
            {
                return null;
            }
        }

        return new ValidationResult(this.FormatErrorMessage(this.ErrorMessage));
    }
}

and then decorate your model with it:

[MyValidation(6)]
public DateTime EventOccurDate { get; set; }

Upvotes: 4

Related Questions