0

ユーザーがメールで登録する登録ページがあります。モデルの場合、次のような検証ルールがあります。

RuleFor(x => x.Email).EmailAddress().WithMessage(localizationService.GetResource("Common.WrongEmail"));

今の問題は、設定に基づいて、これを特定のドメインの電子メールに再送信したいという要求があることです。

正規表現の検証を行うだけでこれを行いました

RuleFor(x => x.Email).Matches(customerSettings.RestrictLoginPattern).WithMessage(localizationService.GetResource("Customer.Fields.Email.EnteredPasswordWrongFormat"));

そのため、電子メールが正規表現と一致しない場合、エラー メッセージが表示されます。ここまでは順調ですね。

2 番目の仕様は、ユーザーがドメインを送信できないようにすることです。したがって、user.name@test.comの場合、ユーザーはuser.nameだけを書き込むことができるはずです。

これを行うには、email プロパティの get/set を実行しました

    public string Email { 
        set
        {
            _email = value;
        }

        get
        {
            if (_email == null)
                return null;

            if(!_email.EndsWith(LoginSuffix))
            {
                return string.Format("{0}{1}", _email, LoginSuffix);
            }
            return _email;
        }

したがって、 test.comで終わらないものを書くと、それが追加されます。現在の問題は、これがクライアント側で発生しないため、検証で電子メールの形式が正しくないというエラーが表示されることです。

電子メールから取得機能を削除しようとし、検証したプロパティ FormatedEmail を追加しました。FormatedEmail はクライアント側のフォームにないため、正常に動作しますが、検証されない場合、要約エラーのように、電子メール フィールドにフックするエラーを取得できません。

複数のソリューションが表示されます

そのフィールドだけのクライアント側の検証を無効にすることができます。しかし、検索に基づいて、それはおそらく不可能であることがわかりましたか?

カスタムのクライアント側の検証を書くことはできますが、そのような「小さな」問題では非常に複雑に感じます。

どういうわけかエラーをフィールドにバインドする方法はありますか?

ModelState.AddModelError("Email", "Error message");
4

2 に答える 2

0

個人的には、getter/setter のビジネス ロジックの概念は忌まわしいと思います。開発者として、次のことが常に機能することを期待しています。

var foo = {something};
var bar = new Bar{ Baz = foo };
Assert.AreEqual(foo, bar.Baz);

私の意見では、あなたが含めたコードは、私が「魔法」と呼ぶものです。

いずれかの方法。

さまざまな検証ルールを分割しようとします。

public class FooValidator : AbstractValidator<Foo>
{
    public FooValidator()
    {
        RuleFor(x => x.Email)
            .Matches(customerSettings.RestrictLoginPattern)
            .WithMessage(localizationService.GetResource("Customer.Fields.Email.EnteredPasswordWrongFormat"))
            //When User is a full email address
            //Make sure its a valid email address
            .When(x => x.Contains('@') || x.EndsWith("@yourdomain.com"));

        RuleFor(x => x.Email)
            .Matches(InternalUsernamePattern)
            .WithMessage("foobaz")
            //Username does not contain @
            //Internal user rules!
            .Unless(x => x.Contains('@')|| x.EndsWith("@yourdomain.com"));
    }

}
于 2013-04-04T14:53:21.307 に答える