我在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; }
}
有可能做这样的事吗?
答案 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);
}