什么时候必须使用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谓词仅适用于一个规则。 您需要对NotEmptyMust进行条件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上的完整演示。