4

モノレールで構築したいくつかの大規模なアプリケーションでビュー コンポーネントを多用しています - セクションなどをサポートできる、ビュー コンポーネントの ASP.Net MVC での同等のアプローチは何ですか?

4

2 に答える 2

2

実際には、コンポーネントの複雑さに応じて、ASP.NETMVCでViewComponentに相当するものを作成するためのいくつかのオプションがあります。私はこれらの2つのアプローチを使用します。これらは、私が認識しているオプションの中でよりMVCっぽいものです。

1: 最も簡単な方法は、ViewUserControlを作成し、ヘルパーでHtml.RenderPartialを使用して表示することです。ViewUserControlは、バッキングコントローラーのない単純なマークアップです(必要に応じて、コードビハインドファイルを配置できると思います)。オプションで、次のように、RenderPartialを呼び出すときに、モデルオブジェクトまたはViewDataディクショナリ全体をビューに渡すことができます。

<% Html.RenderPartial("TopBar", model); %>

「TopBar」はascxページです。これは、マスターページと通常のビューのどこでも機能します。

2:コンポーネントにさらに複雑なロジックを持たせたり、データソースやIoCなどにアクセスしたりする場合は、Microsoft.Web.Mvcアセンブリにある拡張メソッドであるHtml.RenderActionを使用できます。私はこれをmvccontribディストリビューションから使用しています。これはこのように機能します。必要なすべてのロジックを備えた通常のコントローラーを作成してから、いくつかのビューを作成すると、これらすべてがコンポーネントになります。次に例を示します。

public class AboutComponentController : Controller {
public IRepository Repository{ get; set; }

public ActionResult Detail() {
    var lastEvent = Repository.FindAll<Auditoria>().FirstOrDefault();
    return View(lastEvent);
}

}

IoC(私の場合はWindsor)が注入されるIRepositoryへの参照があり、通常のコントローラーが実行するすべてのことを実行できることに注意してください。

ここで、コンポーネントを使用する任意のページ(マスターまたは通常)で、Microsoft.Web.Mvcをインポートし、適切なパラメーターを使用してHtml.RenderActionを呼び出します。これにより、Monorail ViewComponentと同じように、コントローラーを作成したり、ビューを解決したりするミニMVCパイプラインが作成されます。次のように、ラムダベースのメソッドのバリエーションを使用することを好みます。

<% Html.RenderAction<AboutComponentController>(x => x.Detail("a message"));%>

残念ながら、パラメーターを渡す唯一の方法は、メソッド呼び出し自体を使用することです。これは、コントローラー内で一意である必要があります。ViewComponentに似せるには、まだいくつかの作業が必要です。

コンポーネントのビューでマスターページやレイアウトを使用するのは、それら自体が構成要素であるためです。

Webformsビューエンジンを使用する場合、コードブロックでModel変数を使用するときにインテリセンスが必要な場合は、強く型付けされたビューを使用できることに注意してください。

これの利点は、ビューエンジンをこれらのアプローチと組み合わせることができることです。私は通常、コンポーネントをnvelocityで作成し、aspxページなどに表示します。

部分ビューのキャッシュに問題が発生する可能性がありますが、これまでのところ発生していません。他のオプション(mvccontribのサブコントローラーなど)があると確信していますが、単純なケースでは通常これで十分です。もちろん、aspxビューページで通常のASP.netコンポーネントを使用できますが、それは不正行為ですよね?ヘヘ。お役に立てば幸いです。

于 2009-05-05T20:24:56.670 に答える
0

Phil Haackは、コントローラーをMonoRailsと同様のサブフォルダー/セクションにグループ化するための領域の作成についてブログに書いています。

于 2009-05-02T03:06:41.573 に答える