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.
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