2

我正在尝试使用Fluent Validation,一开始似乎很容易使用,但现在出现了一些问题。我需要验证一个 SignIn 视图模型,如下所示:

public SignInViewModelValidator(IMembershipService membershipService)
    {
        _membershipService = membershipService;

        RuleFor(x => x.EMail).NotEmpty().EmailAddress();
        RuleFor(x => x.Password).NotEmpty().Length(6, 20);

        Custom(x =>
        {
            var user = _membershipService.ValidateUser(x.EMail, x.Password);

            if (user == null)
                return new ValidationFailure("EMail", "Your E-Mail Address or password was invalid.");

            return null;
        });
    }

但我一次得到所有错误,如下所示:

  • “电子邮件”不应为空。
  • 您的电子邮件地址或密码无效。
  • “密码”不应为空。

当其他规则无效时,如何更改此行为以不检查自定义验证规则?换句话说,它应该只在“电子邮件”和“密码”字段有效时检查自定义验证规则。

4

2 回答 2

3

我以这种方式管理这个:

public SignInViewModelValidator(IMembershipService membershipService){

_membershipService = membershipService;

bool firstPhasePassed = true;

RuleFor(x => x.EMail)
    .NotEmpty().WithMessage("")
    .EmailAddress().WithMessage("")
    .OnAnyFailure(x => { firstPhasePassed = false; });

RuleFor(x => x.Password)
    .NotEmpty().WithMessage("")
    .Length(6, 16).WithMessage("")
    .OnAnyFailure(x => { firstPhasePassed = false; });

When(x => firstPhasePassed, () =>
{
    Custom(x =>
    {
        if (_membershipService.ValidateUser(x.EMail, x.Password) == null)
            return new ValidationFailure("EMail", "");

        return null;
    });
});

}

于 2013-08-06T08:03:23.900 回答
1

When只有当您的电子邮件/密码规则有效时,您才能使用该方法检查您的自定义规则。

为了使这更容易,我建议将您的自定义规则逻辑移动到一个单独的方法中(类似于IsValidEmailAndPassword),并使用该Must方法来验证电子邮件和密码。由于您将多个参数(电子邮件和密码)传递到该方法中,请阅读有关Must“接受正在验证的父对象的实例”的重载文档以实施此规则。

希望这些链接为您指明正确的方向。

于 2013-08-05T19:30:22.243 回答