8

Con FluentValidation, è possibile convalidare unocome parsificabile DateTime senza dover specificare un delegato Custom()?Come convalidare una stringa come DateTime utilizzando FluentValidation

Idealmente, mi piacerebbe dire qualcosa come la funzione EmailAddress, ad esempio:

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

Quindi qualcosa di simile:

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

risposta

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

e:

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

oppure potresti scrivere un custom extension method.

+0

questo è impressionante, ma non genererà la corretta validazione HTML5 e convaliderà solo dopo pagina di presentazione, c'è un modo per rendere la libreria generare il corrispondente html5? –

1

Se s.DepartureDateTime è già una proprietà DateTime; non ha senso convalidarlo come DateTime. Ma se è una stringa, la risposta di Darin è la migliore.

Un'altra cosa da aggiungere, Supponiamo che sia necessario spostare il metodo BeAValidDate() su una classe statica esterna, per non ripetere lo stesso metodo in ogni posizione. Se si è scelto così, è necessario modificare la regola di Darin essere:

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

Si può fare esattamente nello stesso modo che EmailAddress è stato fatto.

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

E poi

public class PersonValidator : AbstractValidator<IPerson> 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="PersonValidator"/> class. 
    /// </summary> 
    public PersonValidator() 
    { 
     RuleFor(person => person.DateOfBirth).IsValidDateTime(); 

    } 
}