2011-01-27 10 views
18

WebフォームにはUserControlsがあります。これらのコントロールにはコードビハインドがあり、他のものに依存することなく、異なるプロジェクト/ソリューションで使用することができます。MVC3でUserControlと同等ですか?

いくつかのコントロールをレンダリングするコントロールを作成し、「イベントをトリガーする」リンクをいくつか作成したいと考えています。私は彼らが私のウェブサイトに添付されないようにしたい、別のウェブサイトで同じ "コントロール"を使用できるようにしたい。 MVCに相当するものは何ですか?コントローラでビューをコンパイルし、そのDLLを別の場所で使用することはできますか?

+0

これらの質問に関連しています(ただし、重複はありません)。[73902](http://stackoverflow.com/questions/73902/) asp-net-mvc-components)、[810187](http://stackoverflow.com/questions/810187/is-there-an-equivalent-to-monorail-view-components-for-the-asp-net-mvc –

答えて

17

MVCのWebFormsスタイルの再利用可能なユーザーコントロールに最も近い機能は、htmlヘルパーです。 htmlヘルパーは、マークアップを返すメソッドです。推奨されるアプローチはHtmlHelperオフ拡張メソッドのフォームまたはMVCページの他のいくつかのプロパティでそれらを実装することです:

public static IHtmlString MyControl(this HtmlHelper helper, string value) { 
    return new HtmlString("<p>" + value + "</p>"); 
} 

あなたが直接あなたのMVCプロジェクトにこのメソッドを追加することができたり、別々のクラスに追加することができますとしょうかん。クラスライブラリが参照する必要があるのは、HtmlHelper参照のSystem.Web.Mvc.dllだけです(ほかの型を使用する場合は、System.Web.dllも必要です)。表面的にHTMLヘルパーは、単にユーザーコントロールのようなマークアップを発しながら

通常は大きな違いがある、(この例では、MVC 3の新機能カミソリの構文を使用しています)

@Html.MyControl("my value") 

そうのようなあなたのビューからそれらを呼び出します。最も重要なのは、MVCビューにWebFormsページのライフサイクルの概念がないことです。つまり、ユーザーコントロールとは異なり、htmlヘルパーは1回のパスでレンダリングされます。 WebFormsには、ページ上の他のコントロールとやりとりするためのサーバー側のイベントに接続できるInit、Load、Renderなどのマルチフェーズはありません。

あなたが話しているイベントの種類によっては、タスクを解決するための適切なMVC中心のテクニックがあるかもしれません。あなたは何をしたいの詳細を提供することができますか? HTMLヘルパーは非常に強力です。たとえば、TextBoxForのような組み込みのMVC入力コントロールでは、クライアント側の検証などを行うことができます。

+0

彼はまた、通常の "View"を使用し、 "partial"としてレンダリングし、ViewModelを "Code Behind"として使用できますか? UserControlはASCXであるため、ViewModelを使った部分的なビューです。 –

+1

@rockinthesixstring Partialsは、再利用可能なコンポーネントをいくつかの異なるアプリケーション(アセンブリからビューをロードするカスタムビューエンジンや仮想パスプロバイダを作成していなくても)に含まれる別個のアセンブリで定義できるOPの要件に適合しません。 。 – marcind

+0

はいいいです。私はUserControlが間違った表現であると思うが、たぶん "カスタムコントロール"が適していますか? –

3

「イベント」は、WebFormsと同じ意味でMVCに存在しないため、すべての要件を満たすことは非常に難しいでしょう。

UserControlのUIレイヤーでは、PartialViewを使用する必要があります。PartialViewは、Views/Shared/Templatesフォルダー内にあり、特定のModelタイプと関連付けるかどうかによって異なります。

バックエンド(「イベント」)では、あなたのリンクからリクエストを送信できるコントローラを実装し、必要なすべての動作をサポートする必要があります。

さまざまなプロジェクトでこれらの機能を使用するには、コントローラとテンプレート/パーシャルビューの両方をコピーする必要があります。確かに、WebFormsのdo-it-allユーザーコントロールとして再利用するのは簡単ではないかもしれませんが、これは懸念が明確に分離されているという制限です。これは、よく設計されたレイヤーベースWebFormsアプリケーションも同様です。
コントローラはもちろんコントローラを含む、ただしそれ自身のテストアセンブリなどと、別のアセンブリに分配することができる:私は言及関心事の分離の「制限」にコメントに応答し

更新フロントエンドコードの部分ビュー/テンプレートは、ユーザーコントロールのコードビハインドをコピーするだけでなく(おそらく失敗する可能性があります)、おそらくもう1つのことですその他)。

+0

-1:私は、 "明確な分離の分離"の行までこれをアップホートするつもりでした。コントローラが別のアセンブリに組み込まれず、多くのMVCアプリケーションから参照されるのを防ぐ懸念の分離についてはどうですか?ビューはHTMLのように多かれ少なかれ共有される必要がありますが、.NETコードのすべてが1つ以上の別々のテスト可能なアセンブリに含まれていないのはなぜですか? –

+1

確かに - コントローラは、別個の(テスト可能な)アセンブリに確実に置くことができ、残りのプロジェクトとは独立して共有することができます。私はそれが実行可能ではないと言いません(私はそれが努力する価値があると主張します)。しかし、それはユーザーコントロールを解除するだけでなく、プロジェクト間でコードビハインドファイル(もしあれば)そしてそれはそれだけでそれ自身のすべての魔法をします。 *それは、懸念の明確な分離によって制限されています - 私はそれ以上の犠牲を払っています。 –

関連する問題