コントローラーは、MVCパターンでビューにデータを渡す必要がありますか?


11

私はASP.NET MVC(およびその他のWebベースのMVC実装)を頻繁に使用しますが、これは私が確信したことのないことです。コントローラーとビューは通信する必要がありますか?

もちろん、コントローラーは使用するビューを選択する必要がありますが、コントローラーがビューにデータを渡すのはどういうことですか?私の意見では、ビューがコントローラーからのデータを期待している場合、それらは(コントローラー、ビュー)のペアとして効果的に結び付けられています。代わりに、通常、ビューはモデル自体と通信し、コントローラーから独立しています。

私は正しいアプローチを持っていますか、これは誰も正しい答えがない場合ですか?Webで作業するときと他の環境で作業するときの答えは変わりますか?厳密に型指定されたビュー(ASP.NET MVCなど)の概念がある場合、答えは変わりますか?


これが、「MVC」の「M」の目的である「モデル」です。これは、コントローラーからビューに渡されるデータを表します。
ジェイサリバン

回答:


7

コントローラは、レンダリング/表示のためにビューにさらに渡されるデータを準備します。また、パブリッシュ/サブスクライブメカニズムなどを介してユーザー入力データを受け入れます。MVCの詳細については、WikipediaまたはMartin FowlerのWebサイトの最初の図をご覧ください。

ビューがコントローラーからのデータを予期している場合、それらは(コントローラー、ビュー)のペアとして効果的に結合されます。

ビューは一般にデータを受け入れますが、ほとんどのMVCフレームワークでは、特定のコントローラーに依存しません。例外は、たとえばJavaServer Facesファミリです。一般的に、Rails、Django、Spring MVCなどのフレームワークでは、データ(コンテキスト、通常はマップ/辞書/バッグ)をビュー(ビューはテンプレートビューパターンの実装)に渡すことで、ビューをコントローラーから分離できます。

厳密に型指定されたビュー(ASP.NET MVCなど)の概念がある場合、答えは変わりますか?

プログラミング言語が厳密に型指定されているかどうかは、アプリケーションの編成方法に影響しません。


どのような種類のデータが準備され、渡されますか?簡単な例を見てみましょう。IDで記事を表示します。検証後に渡されるのはIDです(記事を指していない可能性があります)か、コントローラーがデータベースから記事を取得して渡しますか?
アンディハント

IDのみを渡す場合、ビューはレンダリングよりも多くの作業を行っていませんか?おそらくパターンの精神に合わないデータを取得する必要があります。
リグ

1

あなたが提起している質問は、時々私のチームで議論されます。私たちは2つのアプローチについて議論しますが、どちらにも短所と長所があります。

1つ目は、コントローラーが次のパターンでビューを更新する可能性があると主張しています。GUIイベントとモデルイベントの両方をリッスンします。GUIイベントが発生すると、モデル内で必要なアクションが実行され、それが発生してイベントが発生します。現在、コントローラーは通常、必要なデータでビューを更新しています。

2番目のアプローチは、ビュー自体がモデルイベントをリッスンしていることを主張し、イベントにアタッチされたデータまたはモデルのクエリによってデータ自体を更新します。

最初のアプローチでは、アプリケーションで実行されているすべてを実際に制御しているコントローラーにより多くのパワーを与えます。彼の手にあるイベントに応じて、どのようにビューを更新するかを決定する力。このようにして、ビューを純粋に保ちます。ただし、先ほど言ったように、この方法でビューとコントローラーを結合できます。

2番目では、それらを分離していますが、ビューは実際には何らかの方法でそれ自体を制御しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.