2009-08-11 16 views
0

私たちは、新しいアプリケーションのすべてについて、WebフォームからMVCに移行するプロセスを開始しています。マスターページを移植する作業を進めており、すべてのアプリケーションで単一のマスターページを使用する必要があるという要件を満たそうとしています。アプリケーションの主なナビゲーションは、マスターページ内のメニュー内にある必要があります。これを達成するのは簡単でした。難しいのは、それぞれのアプリケーションが、一意の規則セットを使用してメニューに何を表示するかを決定する必要があるということです。いくつかのアプリでは、SiteMapのようなものを介して使用するメニュー構造を簡単に説明します。また、ユーザがどのような役割を持っているかに基づいてメニューに表示される内容を判断する必要がある人もいれば、SiteMapで簡単に処理することもできます。私が苦労している状況は、ユーザーが持つ役割に基づいてメニューを生成する必要があるアプリケーションだけでなく、作業しているデータにもメニューを生成する必要があるアプリケーションです。すなわち、同じユーザは、オブジェクト 'bar'上で作業している場合よりも、オブジェクト 'foo'で作業している場合、ページのメニューで異なるオプションを持つことができる。ASP.NET MVCマスターページのメニューにデータを提供

これまで行ってきたことは、マスターページビューによって呼び出され、カスタムタイプのオブジェクトのリストを取得し、jQueryプラグインによってスタイル付けされた順序付けられていないリストを返すHtmlHelperを作成したことですメニューを表示します。ヘルパーメソッドが受け取るオブジェクトのリストは、ViewDataディクショナリを使用してビューに渡されます。現在、このViewDataノードの値は各コントローラのコンストラクタ内で設定されています。これにより、必要な場合を除いて、各アクションメソッドの値を設定することなく、各ページおよび潜在的に各メソッドが異なるメニューを設定できます。また、SiteMapを解析し、メニューを構築するために必要な項目のリストを返すクラスを作成しました。このクラスは、私がコントローラのViewData値を設定するために使用しているクラスです。アプリケーションがメニューデータの生成方法をより詳細に制御する必要がある場合、正しいタイプのオブジェクトのリストを返す限り、独自のクラスを作成してデータを生成することができます。

この解決策はこれまでのところうまく動作しているように見えますが、何らかの理由で正しいとは感じられません。私は、これを行うためのよりよい方法や、これがこの問題を解決するための有効なアプローチであるという確信を得ることができることを願っています。

答えて

1

それはすべてのページになります何かあれば、このような何か:

ベースコントローラを作成します。

public class MyBaseController : Controller 

は、このコントローラは、それが必要なデータを取得し、中にそのデータを送信さビューへのViewData ["menu"]そして、すべてのコントローラがこの1から継承しています:マスターページで

public class HomeController : MyBaseController 

、あなたのViewDataをループして、メニューを作成します。 (私はカテゴリの一覧を表示私のサブメニューのために、このような何かをしました。)

+0

はちょうど私が知っているように、これは、各ページ/アクションシナリオを考えると、最高のようおそらく解決することをコメントしたかった

メニューを操作する必要があるかもしれません。 (そうでなければ、Html.RenderActionはもう少し意味があると思うが、メニューがユーザの役割のように静的なもので定義されていて、ページごとに変更されない場合) –

+0

私はベースコントローラの作成について考えたが、それぞれのページ/アクションには異なるメニューソースが必要なこともあり、それはうまくいかないようです。 – Hamman359

+0

各ページ/アクションが新しいメニューを指示する場合は、コントローラーとアクションを取るメソッドを持つベースコントローラーを作成し、その吐き出しをViewDataから出します。 – Martin

0

私が読んでいる本(Pro ASP.NET MVC Framework by Apress)で、彼らはmasterページのメニューにHtml.RenderActionを使用しています。私はAsp.net MVCの初心者ですので、多分他の人がこれについてもっと多くの情報を与えることができます。

sourcecodeはapress.comからダウンロードできますが、多分役立つかもしれません。

関連する問題