这是我的 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 = "");
}
}
尝试创建日期格式无效的人时:
在我的CreatePersonModel类中,DateBirth
属性是DateTime
类型,asp.net MVC验证已经为我做了。
但我想使用FluentValidation 自定义错误消息。
我不想因各种原因更改属性类型,例如:
在CreatePersonValidator.cs
课程中,验证是检查日期是否过去:
.LessThan (p => DateTime.Now)
如何自定义错误消息而不使用DataAnnotations (使用FluentValidator)。
答案 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以这种方式进入模型绑定是不可能的。我会提出两个想法/建议:
答案 3 :(得分:0)
试试这个
(1, 42, None)