Asp.net mvc 4 使用Fluent验证的条件登录验证

Asp.net mvc 4 使用Fluent验证的条件登录验证,asp.net-mvc-4,fluentvalidation,Asp.net Mvc 4,Fluentvalidation,我正在尝试使用它,一开始似乎很容易使用,但现在出现了一些问题。我需要验证SignIn view模型,如下所示: public SignInViewModelValidator(IMembershipService membershipService) { _membershipService = membershipService; RuleFor(x => x.EMail).NotEmpty().EmailAddress(); R

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

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;
        });
    }
但是我一次就得到了所有的错误,就像这样:

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

您可以使用该方法仅在电子邮件/密码规则有效时检查自定义规则

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

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

只有在电子邮件/密码规则有效时,您才可以使用该方法检查自定义规则

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


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

我是这样管理的:

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

}

我是这样管理的:

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