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");
}

FluentValidation for When & must?

您遇到的问题是When谓词仅适用于一个规则。您需要对NotEmptyMust都进行条件验证。

有两种方法可以实现这一点。当只有几个条件规则时,选项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扩展方法

新增enum参数
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将被限制为前面的第一条规则