3

我在我的 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; }
}

有可能做这样的事情吗?

4

1 回答 1

4

如果有人到达此页面,我能够(部分)解决问题,这要感谢官方 FluentValidation 页面上的 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);
}
于 2013-07-02T20:25:35.477 回答