メニューに表示したくない特定のページがあります。ただし、ページにいるときは、パンくずリストに表示したい.
クラスでこれを実行しようとしていますが、提供された引数がメニューまたはブレッドクラム内にあるISiteMapNodeVisibilityProvider
かどうかを判断する方法がわかりません。SiteMapNode
どうすればいいですか?
メニューに表示したくない特定のページがあります。ただし、ページにいるときは、パンくずリストに表示したい.
クラスでこれを実行しようとしていますが、提供された引数がメニューまたはブレッドクラム内にあるISiteMapNodeVisibilityProvider
かどうかを判断する方法がわかりません。SiteMapNode
どうすればいいですか?
sourceMetadata パラメーターの「HtmlHelper」要素を確認することで、可視性プロバイダーを呼び出している HTML ヘルパーをテストできます。このパラメーターは、可視性プロバイダーに自動的に渡されます。
使用される名前は、型の FullName (アセンブリ名を除いた完全修飾名) です。
public class MyNodeNotOnMenuVisibilityProvider
: SiteMapNodeVisibilityProviderBase
{
public override bool IsVisible(ISiteMapNode node, IDictionary<string, object> sourceMetadata)
{
if (sourceMetadata.ContainsKey("HtmlHelper") && sourceMetadata["HtmlHelper"].ToString().Equals("MvcSiteMapProvider.Web.Html.MenuHelper"))
{
if (node.Key == "MyNode")
{
return false;
}
}
return true;
}
}
v4 では、sourceMetadata を使用して任意の HTML ヘルパーを介してカスタム情報を渡すこともできます。その後、カスタム可視性プロバイダーでカスタム情報をテストすることもできます。
@Html.MvcSiteMap().Menu(new { myInfo = "Something" })
To hide the menu item but keep the breadcrumbs, follow this: Here i am removing the child node "Products", but it will show in breadcrumbs.
<ul id="menu-nav" class="sf-menu" style="position:relative;transform:translateX(-50%);left:50%;margin-top:0px;">
@foreach (var node in Model.Nodes) {
<li class="current">@Html.DisplayFor(m => node)
@if (node.Children.Any()) {
if(node.Children.Count > 0)
{
for(int n=0;n < node.Children.Count;n++)
{
if(node.Children[n].Title == "Products")
{
node.Children.RemoveAt(n);
}
}
@Html.DisplayFor(m => node.Children)
}
}
</li>
}
メニュー項目をフィルタリングする簡単な方法は、役割によるものです。ISiteMapVisibilityProvider ソリューションにバインドされていない場合は、サイトマップ ファイルを変更したり、Authorize 属性を使用したりできます。うまくいけば、これらのいずれかが役立ちます。
Mvc.sitemap:
<mvcSiteMapNode title="Secret Page" controller="RestrictedController" action="SecretAction" key="SecretPage" roles="MySecretRole" />
Controller/Action:
[Authorize(Roles="MySecretRole")]