Как проверить строку как DateTime с помощью FluentValidation - PullRequest
8 голосов
/ 01 апреля 2010

С FluentValidation возможно ли проверить string как анализируемый DateTime без указания делегата Custom()?

В идеале я хотел бы сказать что-то вроде функции EmailAddress, например ::10000

RuleFor(s => s.EmailAddress).EmailAddress().WithMessage("Invalid email address");

Так что-то вроде этого:

RuleFor(s => s.DepartureDateTime).DateTime().WithMessage("Invalid date/time");

Ответы [ 3 ]

25 голосов
/ 01 апреля 2010
RuleFor(s => s.DepartureDateTime)
    .Must(BeAValidDate)
    .WithMessage("Invalid date/time");

и

private bool BeAValidDate(string value)
{
    DateTime date;
    return DateTime.TryParse(value, out date);
}

или вы можете написать пользовательский метод расширения .

2 голосов
/ 21 марта 2014

Вы можете сделать это точно так же, как и EmailAddress.

http://fluentvalidation.codeplex.com/wikipage?title=Custom

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();   

    }
}
1 голос
/ 14 января 2013

Если s.DepartureDateTime уже является свойством DateTime; бред утверждать его как DateTime. Но если это строка, ответ Дарина самый лучший.

Еще одна вещь, которую нужно добавить, Предположим, вам нужно переместить метод BeAValidDate () во внешний статический класс, чтобы не повторять один и тот же метод в каждом месте. Если вы выбрали это, вам нужно изменить правило Дарина так:

RuleFor(s => s.DepartureDateTime)
    .Must(d => BeAValidDate(d))
    .WithMessage("Invalid date/time");
...