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");
War es hilfreich?

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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top