2012-01-15 7 views
0

私は自分のレイアウト(本質的に私のサイトのすべてのビュー)でこのメニューを利用できます。私は、メニューアイテムの状態(ツリーアイテムが開いているか閉じていなくても)をページリクエスト間で維持したい。私がしたいことはおそらくツリーの状態情報を含むいくつかのクッキーまたはセッション情報を取得する私のレイアウトページから呼び出される子のアクションを持つことができるので、ツリーを正確にどのように最後のリクエストか再構築することができます。私の問題は、私が読んだことから、セッションとクッキーのようなものをコントローラのアクションの中から呼び出すことは悪い習慣です。私が知りたいことは、この問題を解決するためのよりエレガントな方法です。 Cookieとセッションを使用する必要がある場合は、どのように偽装するかについてのアイデアは誰にでもありますか?ありがとうございますビュー全体にわたるメニューツリーの状態を維持する - ASP.NET MVC 3

答えて

0

私たちは部分的なビューとしてメニューを持つことができます。

レンダリングするアクション部分ビューは、状態をレンダリングするためのパラメータを受け入れます。 各リンクは異なるパラメータでアクションを呼び出します。例のため

public PartialViewResult RenderNavigation(int Menuroot, int subMenuItem) 
{ 
IList<MyNavigationItem> navigationItems=GetNavigation();// Some method that'll read nvigationitems. 
navigationItems.Where(n=> n.menuId.Equals(Menuroot) ||n.IsOpen.Equals(subMenuItem)).ToList().ForEach(i=> i.IsOpen=true); 

return View("SomeMenuView",navigationItems); 
} 

public class MyNavigationItem{ 
int menuId{get;set;} 
bool IsOpen{get;set;} 
int parentMenuId{get;set;} // set default -1 for Root Items 
} 
+0

ありがとうございました!どのように正確にメニューをリクエストからリクエストまで持続させることができますか? – enamrik

+0

リクエストをリクエストしてください。これをページ・ツー・ページと考えてください。各ページのメニューは異なります。部分的なビューは、異なるパラメータで各ページで呼び出すことができます。 – Manas

+0

パラメータはどこから来るのでしょうか?クエリ文字列?セッション? – enamrik

1

私の問題は、それがもののコントローラのアクション

興味深い内から セッションとクッキーのようなものを呼び出すための悪い習慣だ、私が読んだものから、です。そして、この記事の著者はなぜそれが悪い習慣になるのかを説明しましたか?あなたのコントローラのアクションからセッションとクッキーにアクセスすることは間違いありません。ユーザーがブラウザを閉じると、永続的なクッキーを使ってツリーのレイアウトを永続させることができないため、実際にはこのような種類のセッションを使用することは適切でない可能性があります。

+0

ありがとうございます。私はその理由がユニットテストであったことを覚えていますFormsCollectionに直接アクセスするのではなく、コントローラのアクションでモデルバインディングを使用する方が良い方法と同じように並べ替えます。問題はレイアウト上で子アクションを使用しているため、モデル結合がオプションかどうかわかりません。 – enamrik

関連する問題