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

しかし、次のように、すべてのエラーを一度に取得しています。

  • 「電子メール」を空にすることはできません。
  • メールアドレスまたはパスワードが無効です。
  • 「パスワード」を空にすることはできません。

他のルールが無効な場合にカスタム検証ルールをチェックしないように、この動作を変更するにはどうすればよいですか? つまり、'EMail' フィールドと 'Password' フィールドが有効な場合にのみ、カスタム検証ルールをチェックする必要があります。

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 に答える