読者です 読者をやめる 読者になる 読者になる

1.21 jigowatts

Great Scott!

ナビゲーションメニューの制御

概要

ナビゲーションメニューの表示・非表示を制御(たとえば権限などで)したい場合、メニュー項目を削除することで非表示とします。
図.1
f:id:sh_yoshida:20131025014100p:plain

手順

図.1のようなナビゲーションメニューに対して「パソコン・オフィス用品」と「食品&飲料」メニュー項目を見せたくない場合、Removeメソッドで項目を削除してしまいます。

        protected void Page_Load(object sender, EventArgs e)
        {   //権限などに見立てて
            bool PC = false;
            bool HOME = true;
            bool FOOD = false;
            bool BOOK = true;

            NavigationMenu.Items[1].ChildItems.RemoveAt(2);

            if (!PC) 
            {
                MenuItem pc = NavigationMenu.FindItem(@"パソコン・オフィス用品");
                if (pc != null) 
                { 
                    NavigationMenu.Items.Remove(pc); 
                }
                
            }
            if (!HOME) 
            {
                MenuItem home = NavigationMenu.FindItem(@"ホーム&キッチン・ペット");
                NavigationMenu.Items.Remove(home);
                if (home != null)
                {
                    NavigationMenu.Items.Remove(home);
                }
            }
            if (!FOOD)
            {
                MenuItem food = NavigationMenu.FindItem(@"食品&飲料");
                NavigationMenu.Items.Remove(food);
                if (food != null)
                {
                    NavigationMenu.Items.Remove(food);
                }
            }
            if (!BOOK)
            {
                MenuItem book = NavigationMenu.FindItem(@"本・コミック・雑誌");
                NavigationMenu.Items.Remove(book);
                if (book != null)
                {
                    NavigationMenu.Items.Remove(book);
                }
            }           
        }

f:id:sh_yoshida:20131027004255p:plain

また、サブメニューを見せたくない場合は子要素を指定して削除します。

MenuItem homeMenu = NavigationMenu.FindItem(@"ホーム&キッチン・ペット");

if (homeMenu != null)
{
    homeMenu.ChildItems.RemoveAt(1);
}

f:id:sh_yoshida:20131027001355p:plain

MSDNを見るとサブメニューは以下のように取れると書いてあるのですが、うまく動きませんでした。

// Retrieve the Movie submenu item from the ChildItems
// collection of the root menu item.
MenuItem movieSubMenuItem = NavigationMenu.FindItem(@"Home\Movies");

// Remove the Movie submenu item.
if (movieSubMenuItem != null)
{
  homeMenuItem.ChildItems.Remove(movieSubMenuItem);
}

何でだろ?と思いよくよく読んでみたら、ページの一番下に間違えが指摘してありました。
@"Home\Movies" ←間違い
@"Home/Movies" ←正しくはスラッシュでした。

バックスラッシュと間違えて書いてしまったんでしょうね。
ですので上の処理は以下のように書き換えられます。

MenuItem homeSubMenu = NavigationMenu.FindItem(@"ホーム&キッチン・ペット/インテリア・家具・寝具");

if (homeSubMenu != null)
{
    home.ChildItems.Remove(homeSubMenu);
}

複数のリスト項目を削除する場合を考慮すると、名称で処理を制御するべきですね。

参考

Amazonの商品カテゴリ