2010-04-01 19 views
8

kullanarak DateTime olarak bir dize doğrulamak için, bir Custom() delegenin belirtmek zorunda kalmadan ayrıştırılabilir DateTime olarak string doğrulamak mümkün mü?Nasıl FluentValidation ile FluentValidation

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

Yani böyle bir şey:

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

cevap

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

ve:

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

İdeal olarak, ben mesela EmailAddress işlevi gibi bir şey söylemek istiyorum

veyayazabilirsiniz..

+0

bu müthiş ama doğru HTML5 doğrulama oluşturmaz ve sadece sayfa gönderdikten sonra doğrular, kütüphane oluşturmak için herhangi bir yol yoktur ilgili html5? –

1

s.DepartureDateTime zaten DateTime özelliği ise; DateTime olarak doğrulamak saçmalıktır. Ama eğer bir ipse, Darin'in cevabı en iyisidir.

Eklenecek başka bir şey, Her yerde aynı yöntemi tekrarlayamamak için BeAValidDate() yöntemini harici bir statik sınıfa taşımanız gerektiğini varsayalım. Bunu seçerseniz, olmaya Darin adlı kuralı değiştirmek gerekir:

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

Yapabilirsin EmailAddress yapıldığını tam olarak aynı şekilde.

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

Sonra

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

    } 
} 
İlgili konular