So validieren Sie eine Zeichenfolge mit FluentValidation als Datum / Uhrzeit
-
23-09-2019 - |
Frage
Ist es mit FluentValidation möglich, a zu validieren string
als parseable DateTime
ohne Angabe eines Custom()
delegieren?
Idealerweise würde ich gerne etwas wie die EmailAddress Funktion sagen, zB.:
RuleFor(s => s.EmailAddress).EmailAddress().WithMessage("Invalid email address");
Also so etwas in der Art:
RuleFor(s => s.DepartureDateTime).DateTime().WithMessage("Invalid date/time");
Lösung
RuleFor(s => s.DepartureDateTime)
.Must(BeAValidDate)
.WithMessage("Invalid date/time");
und:
private bool BeAValidDate(string value)
{
DateTime date;
return DateTime.TryParse(value, out date);
}
oder Sie könnten eine schreiben Benutzerdefinierte Erweiterungsmethode.
Andere Tipps
Sie können dies genau so tun, wie es bei der E-Mail-Adresse der Fall war.
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>());
}
}
Und dann
public class PersonValidator : AbstractValidator<IPerson>
{
/// <summary>
/// Initializes a new instance of the <see cref="PersonValidator"/> class.
/// </summary>
public PersonValidator()
{
RuleFor(person => person.DateOfBirth).IsValidDateTime();
}
}
Wenn s.despecturedAtime bereits eine DateTime -Eigenschaft ist; Es ist Unsinn, es als datetime zu validieren. Aber wenn es eine Zeichenfolge ist, ist Darins Antwort die beste.
Nehmen wir an, dass Sie die Methode BeaValiddate () in eine externe statische Klasse verschieben müssen, um die gleiche Methode an jedem Ort nicht zu wiederholen. Wenn Sie dies ausgewählt haben, müssen Sie Darins Regel ändern, um zu sein:
RuleFor(s => s.DepartureDateTime)
.Must(d => BeAValidDate(d))
.WithMessage("Invalid date/time");