2009-05-01 15 views

答えて

0

Phil Haack blogged MonoRailsに似たサブフォルダ/セクションにコントローラをグループ化するための領域を作成することについて説明します。

+0

モノレールのビューコンポーネントのセクションはエリアと同じではありません。レンダリング時にビューコンポーネントが使用できる名前付きアイテムテンプレートによく似ています - 詳しくはayendeのポストを参照してください: http:// ayende.com/Blog/archive/2007/04/08/Building-View-Components-For-MonoRail.aspx – Bittercoder

2

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

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(私の場合はウィンザー)を注入する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コンポーネントを使用できますが、それは不正行為でしょうか? hehe。私はそれが助けて欲しい

+0

詳細な回答をいただきありがとうございます。私はパーシャルを使用していますが、まだレンダリングを試していません。興味深いね。 残念ながら、私が現在持っているビューコンポーネントを置き換えて、モノレールでセクションを大量に使用しているのを助けてくれません(http://ayende.com/Blog/archive/2007/04/08/Building-View -Components-For-MonoRail.aspx) - この動作をエミュレートする方法があるかどうか調べるために、さらに調査する必要があるようです。 – Bittercoder

+0

@Bittercoderは、ビューコンポーネントを重いセクションの使用で置き換えることについて何かを見つけることができましたか? – Tinister