2010-04-01 21 views
8

Con FluentValidation, ¿es posible validar un string como un parseable DateTime sin tener que especificar un delegado Custom()?Cómo validar una cadena como DateTime usando FluentValidation

Idealmente, me gustaría decir algo así como la función EmailAddress, por ejemplo:

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

Así que algo como esto:

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

Respuesta

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

y:

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

o podría escribir un custom extension method.

+0

esto es impresionante pero no va a generar la validación HTML5 adecuada y sólo validará después de la presentación página, ¿hay alguna manera de hacer que la biblioteca de generar el html5 correspondiente? –

1

Si s.DepartureDateTime ya es una propiedad DateTime; no tiene sentido validarlo como DateTime. Pero si es una cadena, la respuesta de Darin es la mejor.

Otra cosa para agregar, Supongamos que necesita mover el método BeAValidDate() a una clase estática externa, para no repetir el mismo método en todos los lugares. Si ha elegido así, tendrá que modificar la regla de Darin ser:

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

Puede hacerlo de la misma manera que se hizo 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>()); 
    } 
} 

Y luego

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

    } 
} 
Cuestiones relacionadas