使用FluentValidator验证DateTime

时间:2011-10-15 13:07:05

标签: asp.net-mvc-3 datetime fluentvalidation

这是我的 ViewModel 类:

public class CreatePersonModel
{
    public string Name { get; set; }
    public DateTime DateBirth { get; set; }
    public string Email { get; set; }
}

CreatePerson.cshtml

@model ViewModels.CreatePersonModel
@{
    ViewBag.Title = "Create Person";
}

<h2>@ViewBag.Title</h2>

@using (Html.BeginForm())
{
    <fieldset>
        <legend>RegisterModel</legend>

        @Html.EditorForModel()

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

CreatePersonValidator.cs

public class CreatePersonValidator : AbstractValidator<CreatePersonModel>
{
    public CreatePersonValidator()
    {
        RuleFor(p => p.Name)
            .NotEmpty().WithMessage("campo obrigatório")
            .Length(5, 30).WithMessage("mínimo de {0} e máximo de {1} caractéres", 5, 30)
            .Must((p, n) => n.Any(c => c == ' ')).WithMessage("deve conter nome e sobrenome");

        RuleFor(p => p.DateBirth)
            .NotEmpty().WithMessage("campo obrigatório")
            .LessThan(p => DateTime.Now).WithMessage("a data deve estar no passado");

        RuleFor(p => p.Email)
            .NotEmpty().WithMessage("campo obrigatório")
            .EmailAddress().WithMessage("email inválido")
            .OnAnyFailure(p => p.Email = "");
    }
}

尝试创建日期格式无效的人时:

Error trying to save the person

观察

在我的CreatePersonModel类中,DateBirth属性是DateTime类型,asp.net MVC验证已经为我做了。

但我想使用FluentValidation 自定义错误消息

我不想因各种原因更改属性类型,例如:

CreatePersonValidator.cs课程中,验证是检查日期是否过去:

.LessThan (p => DateTime.Now)

问题

如何自定义错误消息而不使用DataAnnotations (使用FluentValidator)。

4 个答案:

答案 0 :(得分:14)

public CreatePersonValidator()
{
    RuleFor(courseOffering => courseOffering.StartDate)
       .Must(BeAValidDate).WithMessage("Start date is required");

    //....
}

private bool BeAValidDate(DateTime date)
{
    return !date.Equals(default(DateTime));
}

答案 1 :(得分:3)

查看GitHub上的Fluent验证文档:

https://github.com/JeremySkinner/FluentValidation/wiki

尝试添加RegEx Validator,以确保在应用Less Than Validator之前,可以正确地将用户的输入(字符串)解析为日期。

修改

运行少量测试用例并查看Fluent Validator的源代码后,我承认上述方法不起作用。

在模型绑定阶段添加标准错误,该阶段在流畅验证框架可以访问和检查模型之前发生。

我认为框架的作者很聪明并且将他们的验证代码注入到模型绑定阶段。看起来他们不是。

所以简短的回答就是你想做的事情似乎不可能。

答案 2 :(得分:1)

正如Stewart所说,单独使用FluentValidation以这种方式进入模型绑定是不可能的。我会提出两个想法/建议:

  1. 如果您确实无法将ViewModel类型从DateTime更改为字符串,您可以在模型绑定后自行清除模型状态,然后手动运行验证器(我假设您已经有线FluentValidation在模型绑定后自动执行。)
  2. 在这样的场景中,我会将属性更改为字符串,但是然后使用AutoMapper将其映射到DateTime,以用于最终需要它的任何业务对象/域模型/服务合同请求。 这样,您可以在模型绑定的两侧进行解析和转换时获得最大的灵活性。

答案 3 :(得分:0)

试试这个

(1, 42, None)