Как проверить строку как DateTime с помощью FluentValidation
-
23-09-2019 - |
Вопрос
Можно ли с помощью FluentValidation проверить string
как анализируемый DateTime
без необходимости указывать Custom()
делегировать?
В идеале я бы хотел сказать что-то вроде функции EmailAddress, например:
RuleFor(s => s.EmailAddress).EmailAddress().WithMessage("Invalid email address");
Итак, что-то вроде этого:
RuleFor(s => s.DepartureDateTime).DateTime().WithMessage("Invalid date/time");
Решение
RuleFor(s => s.DepartureDateTime)
.Must(BeAValidDate)
.WithMessage("Invalid date/time");
а также:
private bool BeAValidDate(string value)
{
DateTime date;
return DateTime.TryParse(value, out date);
}
или вы можете написать Метод пользовательского расширения.
Другие советы
Вы можете сделать это точно так же, как это было сделано с помощью EmailAddress.
http://fluentvalidation.codeplex.com/wikipage?title=Пользовательский
public class DateTimeValidator<T> : PropertyValidator
{
public DateTimeValidator() : base("The value provided is not a valid date") { }
protected override bool IsValid(PropertyValidatorContext context)
{
if (context.PropertyValue == null) return true;
if (context.PropertyValue as string == null) return false;
DateTime buffer;
return DateTime.TryParse(context.PropertyValue as string, out buffer);
}
}
public static class StaticDateTimeValidator
{
public static IRuleBuilderOptions<T, TProperty> IsValidDateTime<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder)
{
return ruleBuilder.SetValidator(new DateTimeValidator<TProperty>());
}
}
А потом
public class PersonValidator : AbstractValidator<IPerson>
{
/// <summary>
/// Initializes a new instance of the <see cref="PersonValidator"/> class.
/// </summary>
public PersonValidator()
{
RuleFor(person => person.DateOfBirth).IsValidDateTime();
}
}
Если S.DepartudateTime уже является собственностью DateTime; Это чепуха, чтобы проверить это как DateTime. Но если это строка, ответ Дарина - лучший.
Еще одна вещь, которую нужно добавить, предположим, что вам нужно переместить метод Beavaliddate () на внешний статический класс, чтобы не повторять один и тот же метод в каждом месте. Если вы выбрали это, вам нужно изменить правило Дарина, чтобы быть:
RuleFor(s => s.DepartureDateTime)
.Must(d => BeAValidDate(d))
.WithMessage("Invalid date/time");