Jam*_*123 11 c# asp.net-mvc fluentvalidation asp.net-mvc-4
当dropdownlist值为,yes并且字段必须为date 时,我正在尝试使用FluentValidation validaton .当dropdownlist yes检查时它正在工作date.但是当我选择No它时,它也会显示验证Must be date.
它应该不再验证是否下拉列表值除了yes.我们怎么做?
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.When(HasMaterialPublishedElseWhereText)
.WithMessage("Required Field")
.Must(BeAValidDate)
.WithMessage("Must be date");
private bool BeAValidDate(string val)
{
DateTime date;
return DateTime.TryParse(val, out date);
}
private bool HasMaterialPublishedElseWhereText(MeetingAbstract model)
{
return model.HasMaterialPublishedElseWhereText != null &&
model.HasMaterialPublishedElseWhereText.Equals("yes");
}
Run Code Online (Sandbox Code Playgroud)
Xen*_*ing 16
您遇到的问题是When谓词仅适用于一个规则.您需要对NotEmptyAND和Must.进行条件验证.
有两种方法可以实现这一目标.当只有几个条件规则时,选项1更整洁,否则我会使用选项2.
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.When(HasMaterialPublishedElseWhereText)
.WithMessage("Required Field")
.Must(BeAValidDate)
.When(HasMaterialPublishedElseWhereText)
.WithMessage("Must be date");
Run Code Online (Sandbox Code Playgroud)
要么
When(HasMaterialPublishedElseWhereText, () => {
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.WithMessage("Required Field");
RuleFor(x => x.DtPublishedTimeText)
.Must(BeAValidDate)
.WithMessage("Must be date");
});
Run Code Online (Sandbox Code Playgroud)
请注意:我不知道HasMaterialPublishedElseWhereText它是什么或看起来像什么.我假设你可以使用它作为谓词
编辑:
我还要看一下重构HasMaterialPublishedElseWhereText方法,以下是不容易出错的.
private bool HasMaterialPublishedElseWhereText(MeetingAbstract model)
{
return String.Equals(model.HasMaterialPublishedElseWhereText, "yes", StringComparison.InvariantCultureIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
小智 9
您只需更改通话顺序即可.试试这个:
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.WithMessage("Required Field")
.Must(BeAValidDate)
.WithMessage("Must be date")
.When(HasMaterialPublishedElseWhereText);
Run Code Online (Sandbox Code Playgroud)
将When适用于所有之前的规则.因此,在您的代码中直接应用它之后NotEmpty,它仅应用于NotEmpty规则而不应用于Must规则.
DotNetFiddle上的完整演示.