LSTANCZYK
9/25/2017 - 1:55 AM

MinDateAddDaysFromNow

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class DateComparerAttribute : ValidationAttribute, IClientValidatable
{
    /// <summary>
    /// If set will use DateTime.AddDays to specify the Min Valid Date
    /// </summary>
    public double MinDateAddDaysFromNow
    {
        get { return _minDateAddDaysFromNow; }
        set
        {
            _minAddSet = true;
            _minDateAddDaysFromNow = value;
        }
    }

    /// <summary>
    /// If set will use DateTime.AddDays to specify the Max Valid Date
    /// </summary>
    public double MaxDateAddDaysFromNow
    {
        get { return _maxDateAddDaysFromNow; }
        set
        {
            _maxAddSet = true;
            _maxDateAddDaysFromNow = value;
        }
    }

    /// <summary>
    /// If MinDateAddDaysFromNow is not set then this is used to JQuery select the Property that must be a date from the page
    /// </summary>
    public string MinDateSelector { get; set; }
    /// <summary>
    /// If MaxDateAddDaysFromNow is not set then this is used to JQuery select the Property that must be a date from the page
    /// </summary>
    public string MaxDateSelector { get; set; }

    public override string FormatErrorMessage(string name)
    {
        if (String.IsNullOrEmpty(ErrorMessage))
        {
            return "Date is invalid";
        }
        else
        {
            return ErrorMessage;
        }
    }

    public DateTime? MinDate
    {
        get
        {
            if (String.IsNullOrEmpty(MinDateSelector))
            {
                return _minAddSet ? DateTime.Now.AddDays(MinDateAddDaysFromNow) : DateTime.Now.AddYears(-20);
            }
            return null;
        }
    }

    public DateTime? MaxDate
    {
        get
        {
            if (String.IsNullOrEmpty(MaxDateSelector))
            {
                return _maxAddSet ? DateTime.Now.AddDays(MaxDateAddDaysFromNow) : DateTime.Now.AddYears(20);
            }
            return null;
        }
    }



    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
    {
        return new[]
        {
            new ModelClientValidationRangeDateRule(FormatErrorMessage(metadata.GetDisplayName()), MinDateSelector, MaxDateSelector, MinDate, MaxDate, metadata.IsNullableValueType)
        };
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (validationTrue)
        {
            return ValidationResult.Success;
        }

        return new ValidationResult(FormatErrorMessage(string.Empty));
    }
}

public class ModelClientValidationRangeDateRule
        : ModelClientValidationRule
{
    public ModelClientValidationRangeDateRule(string errorMessage,
                                                  string minDateSelector, string maxDateSelector, DateTime? minDate, DateTime? maxDate, bool IsNullableValueType)
    {
        ErrorMessage = errorMessage;
        ValidationType = "rangedate";

        ValidationParameters["minselector"] = minDateSelector;
        ValidationParameters["maxselector"] = maxDateSelector;
        ValidationParameters["mindate"] = minDate.HasValue ? minDate.Value.ToString("G") : "";
        ValidationParameters["maxdate"] = maxDate.HasValue ? maxDate.Value.ToString("G") : "";
        ValidationParameters["nullable"] = IsNullableValueType.ToString().ToLower();

    }
}