15

使用 FluentValidation,是否可以在无需指定委托的情况下将 a 验证string为可解析的?DateTimeCustom()

理想情况下,我想说一些类似 EmailAddress 功能的东西,例如:

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

所以是这样的:

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

3 回答 3

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

和:

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

或者您可以编写自定义扩展方法

于 2010-04-01T13:59:28.750 回答
4

您可以按照与 EmailAddress 完全相同的方式进行操作。

http://fluentvalidation.codeplex.com/wikipage?title=自定义

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

    }
}
于 2014-03-20T22:16:19.063 回答
2

如果 s.DepartureDateTime 已经是 DateTime 属性;将其验证为 DateTime 是无稽之谈。但如果它是一个字符串,达林的答案是最好的。

还要补充一点,假设您需要将 BeAValidDate() 方法移动到外部静态类,以免在每个地方重复相同的方法。如果您选择这样做,您需要将 Darin 的规则修改为:

RuleFor(s => s.DepartureDateTime)
    .Must(d => BeAValidDate(d))
    .WithMessage("Invalid date/time");
于 2013-01-14T13:50:18.540 回答