3

登録ページがあり、(ViewModel の StringLength および Required アノテーションに加えて) 重複するユーザー名と電子メール アドレスに対していくつかの検証を実行したいと考えています。現在、登録フォームがポストバックされたときに、コントローラーでこの検証を実行しています。ただし、これが適切な場所であるかどうかはわかりません。

ViewModel が UserRepository への参照を持つ必要があるため、ViewModel が適切な場所であるとは想像できません。モデルクラスでこの種の検証を行うことは理にかなっていますか?

もしそうなら、これをモデルに実装して、リポジトリに送信する前に情報が有効かどうかを確認するにはどうすればよいですか?

アップデート

私のコントローラーアクションのコード:

if (ModelState.IsValid)
        {
            if (!_userRepository.Exists(registerViewModel.Username))
            {
                if (!_userRepository.EmailExists(registerViewModel.Email))
                {
                    _userRepository.Add(
                        new User
                            {
                                Created = DateTime.Now, 
                                Email = registerViewModel.Email, 
                                Password = registerViewModel.Password, 
                                Username = registerViewModel.Username
                            });

                    _userRepository.SaveChanges();
                    TempData["registrationDetails"] = registerViewModel;

                    return RedirectToAction("Confirm");
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "This email address is already in use.");
                }
            }
            else
            {
                ModelState.AddModelError(string.Empty, "This username is already taken.");
            }
        }

        return View(registerViewModel);
    }

更新 2

ドメイン モデルは、ユーザー名や電子メール アドレスの重複などの制約を気にする必要がありますか?それとも、これはコントローラー レイヤーが気にする必要があるものですか?

アップデート 3

リモート検証や送信時のモデル検証で再利用できるため、コントローラーに検証ロジックを配置するのが最も理にかなっているようです。重複をチェックするようなことは、一般的にコントローラーで行うべきことですか、それともドメイン モデルでこの種のチェックを行うことは理にかなっていますか?

ありがとう、

4

5 に答える 5

1

フロントエンド (おそらく ajax) とバックエンドの両方で実行しますが、これはソリューション アーキテクチャによって異なります。

登録に問題が発生した場合は、すぐにユーザーに知らせたいと思います。データ レイヤー/ビジネス レイヤーとプレゼンテーション レイヤーの典型的なセットアップでは、ビジネス ロジックで重複チェックを実行し、コントローラーにそのコードを呼び出します (ユーザーのフロント エンドでの ajax ルックアップに加えて)。

余談ですが、私は通常、Windows アプリケーションで MVVM (ビュー モデルを使用) のみを使用することを好みます。MVC と MVVM を組み合わせると、必要以上に複雑になる可能性があります

于 2011-03-02T04:20:59.927 に答える
0

コントローラーでこれを行うことをお勧めします。

主な理由は、アプリの構造がどうであれ、Ajax を使用して、ユーザー名が既に使用されているかどうかをユーザーに通知する必要があるためです。それ以外の場合は、コード構造を正当化しない使いやすさが悪いだけです。

そのためには、ユーザー名が存在するかどうかをajaxで確認できるアクションメソッドが必要です。

全体として、2 セットの検証方法 (UI とモデル) になる可能性があることを意味しますが、すべて正当な理由があります。

また、使いやすいサイトを作成するには、ノックアウト js やバックボーンなどの Javascript フレームワークを使用する必要があります。それは真のMVVMであり、その場合、ViewModelをModelレイヤークラスにすることはお勧めできません(クリスが述べたように)。したがって、基本的には、とにかく 2 つの検証セットが必要になります。

于 2011-03-02T05:18:37.397 に答える
0

ロブがコメントで言ったように、それはアプリケーションの構造に依存します。サービスにヒットするデータが有効であることを確認するために、二重の検証 (ViewModel の検証とサービス レイヤーの検証) を行う傾向があります。私のサービスは複数のクライアントで使用されるため、これは役に立ちますが、ビューと ViewModel はクライアント固有です。フロントエンドの検証には即時のフィードバックという利点があり、バックエンドの検証はデータをクリーンに保つのに役立ちます。

于 2011-03-02T04:22:39.980 に答える
0

私の提案は、電子メールアドレスとユーザー名の重複などの検証の場合、検証メソッドをコントローラーに保持することです。

または、検証レイヤーで-ビューモデルとデータレイヤーの間で使用されます

MVC3 の場合、ビュー モデルのプロパティに Remote 属性を使用してコントローラのメソッドをアクションとして追加し、すぐに結果を得ることができます。

于 2011-03-02T04:32:50.617 に答える
0

ビュー (クライアント側) とコントローラー (サーバー側) の両方で検証する必要があります。MVC 3 を使用している場合は、新しいRemoteAttributeを使用できます。jQuery を使用してサーバー側の呼び出しを行い、ユーザーまたは電子メール アドレスの存在を確認できます。

于 2011-03-02T06:28:18.050 に答える