8

का उपयोग कर दिनांक समय के रूप में एक स्ट्रिंग को मान्य करने के लिए, यह एक Custom() प्रतिनिधि निर्दिष्ट किए बिना ही एक string एक parseable DateTime के रूप में मान्य करने के लिए संभव है?कैसे FluentValidation साथ FluentValidation

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

आदर्श रूप में, मैं EmailAddress समारोह की तरह कुछ, जैसे कहना चाहते हैं

या आपलिख सकते हैं।

+0

इस भयानक है, लेकिन यह उचित एचटीएमएल 5 सत्यापन उत्पन्न नहीं करेगा और पेज जमा करने के बाद ही मान्य होगा, वहाँ पुस्तकालय उत्पन्न करने के लिए किसी भी तरह से है संबंधित एचटीएमएल 5? –

1

यदि s.DepartureDateTime पहले से ही डेटटाइम संपत्ति है; डेटटाइम के रूप में इसे सत्यापित करने के लिए बकवास है। लेकिन अगर यह एक स्ट्रिंग है, तो डारिन का जवाब सबसे अच्छा है।

जोड़ने के लिए एक और चीज, मान लीजिए कि आपको हर जगह एक ही विधि को दोहराने के लिए BeAValidDate() विधि को बाहरी स्थैतिक वर्ग में स्थानांतरित करने की आवश्यकता है। ठीक उसी तरह है कि EmailAddress किया गया था

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

आप यह कर सकते हैं: आप ऐसा चुना है, तो आप डैरिन के नियम संशोधित करने की आवश्यकता होगी।

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

    } 
}