Нет явной необходимости использовать только свойство ErrorMessage
для установки текста ошибки.Вы можете ввести дополнительные свойства, чтобы указать, нужно ли проверять, равны ли даты
public string ErrorMessage2 { get; set; }
protected override ValidationResult IsValid(object startTime, ValidationContext validationContext)
{
var endTimePropertyValue = validationContext.ObjectType.GetProperty(EndTimePropertyName)
.GetValue(validationContext.ObjectInstance);
if (startTime != null && startTime is DateTime
& endTimePropertyValue != null && endTimePropertyValue is DateTime)
{
DateTime startDateTime = (DateTime)startTime;
DateTime endDateTime = (DateTime)endTimePropertyValue;
//if second error message is not empty we check if date are the same
bool checkIfEqual = !string.IsNullOrEmpty(ErrorMessage2);
if (checkIfEqual && startDateTime == endDateTime)
{
return new ValidationResult(ErrorMessage2);
}
else if (startDateTime > endDateTime)
{
return new ValidationResult(ErrorMessage);
}
}
return ValidationResult.Success;
}
. Можно ли вообще отказаться от ErrorMessage
и использовать жестко закодированные строки
private const string StartDateBefore = "StartTime should before than EndTime and EndTime2";
private const string StartDateEqual = "StartTime is equal to EndTime";
public bool CheckIfEqual { get; set; }
protected override ValidationResult IsValid(object startTime, ValidationContext validationContext)
{
var endTimePropertyValue = validationContext.ObjectType.GetProperty(EndTimePropertyName)
.GetValue(validationContext.ObjectInstance);
if (startTime != null && startTime is DateTime
& endTimePropertyValue != null && endTimePropertyValue is DateTime)
{
DateTime startDateTime = (DateTime)startTime;
DateTime endDateTime = (DateTime)endTimePropertyValue;
if (CheckIfEqual && startDateTime == endDateTime)
{
return new ValidationResult(StartDateEqual); //error message when dates are equal
}
else if (startDateTime > endDateTime)
{
return new ValidationResult(StartDateBefore); //error message when start date is after enddate
}
}
return ValidationResult.Success;
}
Использование
[SomeValidation(nameof(EndDate), CheckIfEqual = true)]
public DateTime StartDate { get; set; }
Чтобы этот атрибут валидации работал с валидацией на стороне клиента, вам необходимо реализовать интерфейс IClientModelValidator
, как описано здесь .
public void AddValidation(ClientModelValidationContext context)
{
//"beforedate" and "equaldate" will be added as custom validators
//for unobtrusive validation
context.Attributes.Add("data-val-beforedate", StartDateBefore);
if (CheckIfEqual)
context.Attributes.Add("data-val-equaldate", StartDateEqual);
}
С этим кодом реализовано input
будет содержать дополнительные атрибуты с соответствующими сообщениями об ошибках.Теперь нам нужно реализовать собственные валидаторы в javascript и скопировать логику валидации из C#
code
//add "beforedate" custom validator
$.validator.addMethod("beforedate", function (value, element, parameters) {
var startDate = new Date(value);
var endDate = new Date($("#EndDate").val());
//if condition is true then value considered valid
return endDate >= startDate;
});
//add unobtrusive adapter to run "beforedate" validation
$.validator.unobtrusive.adapters.add("beforedate", [], function (options) {
options.rules.beforedate = {};
options.messages["beforedate"] = options.message; //save error message passed from C#
});
$.validator.addMethod("equaldate", function (value, element, parameters) {
var startDate = new Date(value);
var endDate = new Date($("#EndDate").val());
return endDate.getTime() != startDate.getTime();
});
$.validator.unobtrusive.adapters.add("equaldate", [], function (options) {
options.rules.equaldate = {};
options.messages["equaldate"] = options.message;
});