FluentValidation for When & must?

asp.net-mvc, asp.net-mvc-4, c#, fluentvalidation

Solution

The issue you are having is the `When` predicate only applies to one rule. You need to have conditional validation on both the `NotEmpty` AND the `Must`.

There two ways to achieve this. Option 1 is tidier when there are only a couple of conditional rules, otherwise I'd use option 2.

RuleFor(x => x.DtPublishedTimeText)
    .NotEmpty()
        .When(HasMaterialPublishedElseWhereText)
        .WithMessage("Required Field")
    .Must(BeAValidDate)
        .When(HasMaterialPublishedElseWhereText)
        .WithMessage("Must be date");

Or

When(HasMaterialPublishedElseWhereText, () => {
    RuleFor(x => x.DtPublishedTimeText)
        .NotEmpty()
            .WithMessage("Required Field");
    RuleFor(x => x.DtPublishedTimeText)
        .Must(BeAValidDate)
            .WithMessage("Must be date");
});

Do note: I have no idea what `HasMaterialPublishedElseWhereText` is or what it looks like. I am assuming you can use it as a predicate

EDIT:

I'd also look at refactoring the `HasMaterialPublishedElseWhereText` method, the following is less error prone.

private bool HasMaterialPublishedElseWhereText(MeetingAbstract model)
{
    return String.Equals(model.HasMaterialPublishedElseWhereText, "yes", StringComparison.InvariantCultureIgnoreCase);
}

Problem

I am trying use FluentValidation validaton when dropdownlist value is `yes` and the field must be date. it is working when dropdownlist is `yes` checking for `date`. But also showing validation when I select `No` still it says `Must be date`. It should not validate anymore if dropdownlist value otherthan the `yes`. How can we do that? ``` 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"); } ```

Original source