8

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

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

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

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

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

ответ

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

и:

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

или вы можете написать custom extension method.

+0

это является удивительным, но это не будет генерировать надлежащую проверку HTML5 и будет проверять только после представления страницы, есть ли способ, чтобы сделать библиотеку генерировать Соответствующий html5? –

1

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

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

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

Вы можете сделать это точно так же, как 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(); 

    } 
} 
Смежные вопросы