When&must的FluentValidation?

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上的完整演示.