什么时候必须使用FluentValidation?
当dropdownlist值为yes
且字段必须为date时,我正在尝试使用FluentValidation validaton。 它是在dropdownlist yes
检查date
。 但是当我选择No
时也会显示validation,但它仍然表示Must be date
。
如果下拉列表值不是,则不应再validation。 我们怎么能这样做?
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
进行条件validation。
有两种方法可以实现这一目标。 当只有几个条件规则时,选项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
规则。
DotNetFiddle上的完整演示。