0

現在のアクションが MVC.sitemap ファイルにリストされていない場合に、サイトマップ コントロールに強制的にメニューを表示させることはできますか?

シンプルなトップナビです。現在のアクションがサイトマップにある場合、 を呼び出すと.Menu()正しい<ul><li>..データがレンダリングされます。ただし、 /Home/Login などのサイトマップにないページに到達した場合、html はまったくレンダリングされません (コメントでさえなく、空のスペースだけです)。これは[authorize]問題ではありません。「/Home/Index」にいるときのメニューは問題ありません。

要求されたものをレンダリングする必要があるようですが、プロパティIsCurrentNodeIsNodeInPathプロパティを設定しないでください。ここに私がかけている電話があります

<div id="main-nav">
    @Html.MvcSiteMap().Menu(0, true, true, 1)
</div>

Mvc.sitemap ファイル:

<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="Form New Human" controller="Person" action="Create"/>
    <!-- there is no mvcSiteMapNode for "Home" "Login" -->
</mvcSiteMapNode>
4

1 に答える 1

1

それを回避する方法を見つけました。どうやら組み込みの拡張メソッドではないか、少なくとも見つけられませんでした。呼び出すことはできますHtml.MvcSitemap().Menu(Html.MvcSiteMap.Provider.RootNode,...)が、ヘルパーを 2 回インスタンス化したくありませんでした。

<div id="main-nav">
@{
    var sm = Html.MvcSiteMap();
    @sm.Menu(sm.Provider.RootNode, true, true, 2);  // 2 levels (home, plus main nav)
}
</div>

逆アセンブリを見回すと、次のように少し動作することがわかります。

  • あなたは本当に開始ノードが必要です
  • 指定しない場合は、現在のノードに基づいて検索しようとします
    • プラスの制限 (前方検索、深さの制限など)
    • レベル 1 のノードが必要な場合は、現在のレベルを知る必要があります
  • それはnullを返すため、開始ノードはnullです。つまり、ヘルパーは空の文字列を書き込みます

これを行うために仕上げることができるトリックの組み合わせ、またはオーバーロードが 1 つまたは 2 つある可能性がありますが、今のところ見つけることができません。これは私のニーズに合っています(シンプルなトップメニュー)。これを行うためのより簡単な方法、ワイルドカードを使用する方法、またはルートベースで最も近い一致を行う方法が必要です。メニューはウェブアプリのかなり標準的な部分であり、これはカバーされると思いました:)

于 2012-05-15T07:11:57.517 に答える