I am using the FluentValidation package in my ASP.net project. I would like to know how to pass a parameter to the Validator constructor.
Here is what I would like to do with my validator. Notice the string MsgParam in the constructor:
public class RegisterModelValidator : AbstractValidator<RegisterModel>
{
    public RegisterModelValidator(string MsgParam) // <= Here
    {
        RuleFor(x => x.UserName)
            .NotNull()
            .WithMessage(MsgParam);
        RuleFor(x => x.Password)
            .NotNull()
            .Length(6, 100);
        RuleFor(x => x.ConfirmPassword)
            .Equal(x => x.Password);
    }
}
And my model, where I do not know if I can pass anything using data annotation:
// Find a way to pass a string to the validator
[FluentValidation.Attributes.Validator(typeof(RegisterModelValidator))]
public class RegisterModel
{
    public string UserName { get; set; }
    [DataType(DataType.Password)]
    public string Password { get; set; }
    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }
}
Is it possible to do such a thing?
In case someone arrives to this page, I was able to (partially) solve the problem thanks to JeremyS on the official FluentValidation page.
Be aware that with this solution, the client-side validation unfortunately disappears!
To take parameters in the validator constructor you need to instantiate it manually instead of relying on automatic creation.
The RegisterModel becomes:
public class RegisterModel
{
    public string UserName { get; set; }
    [DataType(DataType.Password)]
    public string Password { get; set; }
    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }
}
And the Register method in the controller needs to be modified like this:
using FluentValidation.Mvc;
...
public ActionResult Register(RegisterModel model)
{
    RegisterModelValidator rmv = new RegisterModelValidator("Message passed as param");
    var result = rmv.Validate(model);
    if (result.IsValid)
    {
        // Here you decide what to do if the form validates
    }
    else
    {
        result.AddToModelState(ModelState, null);
    }
    return View(model);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With