Skip to content

Instantly share code, notes, and snippets.

@LSTANCZYK
Forked from JustinMason/gist:5200208
Last active November 17, 2017 19:34
Show Gist options
  • Save LSTANCZYK/fd7358e1fe1dbdde080f70437965a772 to your computer and use it in GitHub Desktop.
Save LSTANCZYK/fd7358e1fe1dbdde080f70437965a772 to your computer and use it in GitHub Desktop.
[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();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment