Come convalidare una stringa come DateTime utilizzando FluentValidation
-
23-09-2019 - |
Domanda
Con FluentValidation, è possibile convalidare un string
come DateTime
analizzabile senza dover specificare un delegato Custom()
?
Idealmente, mi piacerebbe dire qualcosa come la funzione EmailAddress, per esempio:.
RuleFor(s => s.EmailAddress).EmailAddress().WithMessage("Invalid email address");
Quindi, qualcosa di simile a questo:
RuleFor(s => s.DepartureDateTime).DateTime().WithMessage("Invalid date/time");
Soluzione
RuleFor(s => s.DepartureDateTime)
.Must(BeAValidDate)
.WithMessage("Invalid date/time");
e
private bool BeAValidDate(string value)
{
DateTime date;
return DateTime.TryParse(value, out date);
}
o si potrebbe scrivere un metodo un'estensione personalizzata .
Altri suggerimenti
Si può fare esattamente lo stesso modo in cui è stato fatto 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>());
}
}
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();
}
}
Se s.DepartureDateTime è già una proprietà DateTime; è una sciocchezza per convalidarlo come DateTime. Ma se una stringa, la risposta di Darin è il migliore.
Un'altra cosa da aggiungere, Supponiamo che è necessario spostare il metodo BeAValidDate () per una classe statica esterna, al fine di non ripetere lo stesso metodo in ogni luogo. Se si è scelto così, è necessario modificare la regola di Darin essere:
RuleFor(s => s.DepartureDateTime)
.Must(d => BeAValidDate(d))
.WithMessage("Invalid date/time");