FluentValidation for When & must?
本文关键字:must amp for When FluentValidation | 更新日期: 2023-09-27 18:06:25
我正在尝试使用FluentValidation验证时下拉列表值是yes
和字段必须是日期。当下拉列表为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");
}
您遇到的问题是When
谓词仅适用于一个规则。您需要对NotEmpty
和Must
都进行条件验证。
有两种方法可以实现这一点。当只有几个条件规则时,选项1更简洁,否则我会使用选项2。
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.When(HasMaterialPublishedElseWhereText)
.WithMessage("Required Field")
.Must(BeAValidDate)
.When(HasMaterialPublishedElseWhereText)
.WithMessage("Must be date");
或
When(HasMaterialPublishedElseWhereText, () => {
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.WithMessage("Required Field");
RuleFor(x => x.DtPublishedTimeText)
.Must(BeAValidDate)
.WithMessage("Must be date");
});
注意:我不知道HasMaterialPublishedElseWhereText
是什么或它看起来像什么。我假设你可以用它作为谓词
编辑:
我还会考虑重构HasMaterialPublishedElseWhereText
方法,下面的方法更不容易出错。
private bool HasMaterialPublishedElseWhereText(MeetingAbstract model)
{
return String.Equals(model.HasMaterialPublishedElseWhereText, "yes", StringComparison.InvariantCultureIgnoreCase);
}
您只需要更改调用的顺序。试试这个:
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.WithMessage("Required Field")
.Must(BeAValidDate)
.WithMessage("Must be date")
.When(HasMaterialPublishedElseWhereText);
When
适用于上述所有规则。因此,在您的代码中,当您直接在NotEmpty
之后应用它时,它仅适用于NotEmpty
规则,而不适用于Must
规则。
测试版本> = 8.4.0 When
扩展方法
public enum ApplyConditionTo
{
//
// Summary: (default)
// Applies the condition to all validators declared so far in the chain.
AllValidators = 0,
//
// Summary:
// Applies the condition to the current validator only.
CurrentValidator = 1
}
默认 (AllValidators): When
将以规则链结束
(CurrentValidator): When
将被限制为前面的第一条规则