Search code examples
c#asp.net-web-api2fluentvalidation

FluentValidation modify error message in Must function


Inside class that is responsible for validation I have simple rule:

RuleFor(u => u.Id)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .NotEmpty().WithMessage("Id is required")
    .Must(ValidateId);

and below is my ValidateId function:

private bool ValidateId(CreateAccountBindingModel model, string id, PropertyValidatorContext context)
{
    if (id=="test")
    {
        context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("You are testing");
        return false;
    }

    var idValid = IdValidator.IsValid(id);
    if (!idValid)
    {
        context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");
        return false;
    }
    return true;
}

If I run my validator I get default error, not my custom errors I'm specifying inside my function.
I've tried setting them using:

context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");

but without any luck.

How can I define error message inside validation function?


Solution

  • You can use CustomValidator instead:

    RuleFor(u => u.Id)
        .Cascade(CascadeMode.StopOnFirstFailure)
        .NotEmpty().WithMessage("Id is required")
        .Custom(ValidateId);
    

    And below - ValidateId method:

    private void ValidateId(string id, CustomContext context)
    {
        if (id == "test")
        {
             context.AddFailure("You are testing");
        }
        var idValid = IdValidator.IsValid(id);
        if (!idValid)
        {
            context.AddFailure("Id is invalid");
        }
    }