FluentValidation:Validator构造函数中的参数

时间:2013-06-13 07:37:49

标签: asp.net asp.net-mvc fluentvalidation

我在ASP.net项目中使用FluentValidation包。我想知道如何将参数传递给Validator构造函数。

以下是我想用验证器做的事情。注意构造函数中的string MsgParam

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);
    }
}

我的模型,我不知道是否可以使用数据注释传递任何内容:

// 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; }
}

有可能做这样的事吗?

1 个答案:

答案 0 :(得分:4)

如果有人到达此页面,我可以(部分)通过the official FluentValidation page上的JeremyS解决问题。

请注意,使用此解决方案,客户端验证很快就会消失!

要在验证器构造函数中获取参数,您需要手动实例化它,而不是依赖于自动创建。

RegisterModel变为:

public class RegisterModel
{
    public string UserName { get; set; }

    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }
}

控制器中的Register方法需要像这样修改:

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);
}