Search code examples
c#validationfluentvalidation.net-7.0

Fluent Validation - How to remove default error message


I have a project with .NET 7 and try using Fluent Validation. My validation is as below:

RuleFor(x => x.Number)
.Cascade(CascadeMode.Stop)
.Must((model, number, context) =>
{
    var (isValid, isFirstMessage) = IsValidNumber(model.Unit, number);

    if (!isValid)
        context.AddFailure(nameof(model.Number),
         isFirstMessage 
       ? "My first message"
       : "My second message");

    return isValid;
})
.WithMessage(_ => string.Empty);

I use .WitMessage(_ => string.Empty) because if I don't do this, the Fluent Validation gives me a default message as below:

"My validation message",

"The specified condition was not met for 'Number'."

But I don't want any default message so with my way it gives 2 messages :

"My validation message",

""

How can I remove that second fluent message? I want to show my validation message.


Solution

  • context.AddFailure() is used to add multiple error messages for the same rule.

    For your case, you should use Custom message placeholder if you use the Must method.

    RuleFor(x => x.Number)
        .Cascade(CascadeMode.Stop)
        .Must((model, number, context) =>
        {
            var isValid = IsValidNumber(model.Unit, number);
    
            if (!isValid)
                context.MessageFormatter.AppendArgument("ErrorMessage",
                 "My validation message");
    
            return isValid;
        })
        .WithMessage("{ErrorMessage}");
    

    Alternatively, you can implement a custom validator as below:

    RuleFor(x => x.Number)
        .Cascade(CascadeMode.Stop)
        .Custom((number, context) =>
        {
            var isValid = IsValidNumber(context.InstanceToValidate.Unit, number);
    
            if (!isValid)
                context.AddFailure(nameof(Model.Number),
                 "My validation message");
        });
    

    Reference: Custom validators