2012-04-18 5 views
0

У меня есть меню, использующее карту сайта, которая находится на моей главной странице. Я хочу отключить определенные пункты меню в зависимости от пользователя. Ни в коем случае я не хочу спускаться с кроличьей дыры в ролях MS.Создание пунктов меню, невидимых с главной страницы

У меня есть следующий Site.Master:

 <div class="clear hideSkiplink"> 
      <asp:Menu ID="MainMenu" runat="server" DataSourceID="SiteMapDataSource1" 
       Orientation="Horizontal" 
       CssClass="menu" 
       StaticDisplayLevels="1" 
       StaticMenuItemStyle-VerticalPadding="2" 
       StaticMenuItemStyle-HorizontalPadding="10" 
       StaticMenuItemStyle-Font-Name="Verdana" 
       StaticMenuItemStyle-Font-Size="12pt" 
       StaticHoverStyle-BackColor="#707070" 
       StaticHoverStyle-ForeColor="#550000" 

       DynamicMenuStyle-HorizontalPadding="2" 
       DynamicMenuStyle-VerticalPadding="2" 
       DynamicMenuStyle-BackColor="#E0E0E0" 
       DynamicMenuStyle-ForeColor="#FFFFFF" 
       DynamicMenuStyle-BorderWidth="1" 
       DynamicMenuStyle-BorderColor="#C0C0C0" 
       DynamicMenuItemStyle-VerticalPadding="2" 
       DynamicMenuItemStyle-Font-Name="Verdana" 
       DynamicMenuItemStyle-Font-Size="9pt" 
       DynamicMenuItemStyle-ForeColor="#FFFFFF" 
       DynamicHoverStyle-BackColor="#707070" 
       DynamicHoverStyle-ForeColor="#550000" />    


      <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="False" /> 

У меня есть Web.sitemap похожее на следующее:

<siteMapNode > 
    <siteMapNode url="default.aspx" title="Home" description="" /> 

    <siteMapNode url="default.aspx?p=0" title="Admin" description=""> 
     <siteMapNode url="default.aspx?p=55" title="thing1" description="" /> 
     <siteMapNode url="default.aspx?p=56" title="thing2" description="" /> 
    </siteMapNode> 

    <siteMapNode url="default.aspx?p=1" title="Thing3" description=""> 
    </siteMapNode> 
    <siteMapNode url="default.aspx?p=2" title="Thing4" description=""> 
    </siteMapNode> 
</siteMapNode> 

В Site.Master.cs я попытался добавить следующий код под обе Page_Load И под MainMenu_MenuItemDataBound:

Response.Write(MainMenu.Items.Count.ToString()); 

Когда я положил его под MainMenu_MenuItemDataBound, это не имеет никакого эффекта. Когда я положил его под Page_Load(), он печатает нуль, даже если я могу ПОСМОТРЕТЬ меню, отображаемое правильно, и у него есть элементы!

Факты: Меню существует. В меню есть элементы. Меню и элементы отображаются правильно, насколько это возможно.

Я хочу войти и, например, сделать элемент с заголовком «Admin» невидимым (вместе с его подменю) - я хотел бы удалить его, но либо сделать его невидимым, либо отключить его было бы хорошо. Я пробовал различные заклинания с участием MainMenu.FindItem ... какой метод, похоже, не имеет никакого отношения к поиску элементов. Это когда я заметил, что причина, по которой он не находит какие-либо предметы, заключается в том, что количество элементов равно нулю (хотя я вижу элементы).

Решение в соответствии с Дейвом D ниже, но также необходимо добавить

OnMenuItemDataBound="MainMenu_MenuItemDataBound" 

тэгу MainMenu.

ответ

1

Меню не привязано к данным еще в page_load. Вот почему у него нет счета.

Проверка элемента в MenuItemDataBound, поскольку они связаны можно сделать так:

protected void MainMenu_MenuItemDataBound(Object sender, MenuEventArgs e) 
{ 

    if (e.Item.Text == "Admin") 
    { 
     // disable the item 
     //e.Item.Enabled = false; 

     // remove the menu item 
     MainMenu.Items.Remove(e.Item); 

    } 
} 
+0

Не работает. Насколько я могу судить, MainMenu_MenuItemDataBound никогда не вызывается. – elbillaf

+0

AH! Секрет в том, что мне нужно было добавить OnMenuItemDataBound = «MainMenu_MenuItemDataBound» в тег для MainMenu. Поэтому ваше решение действительно работает. – elbillaf

Смежные вопросы