2011-06-30 58 views
1

我想隱藏訪問者的「管理面板」菜單項,而不需要進入角色方法。ASP.net如何隱藏訪客的菜單項?

<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode url="" title="Nav" description=""> 
     <siteMapNode url="~/Default.aspx" title="Home" description=""></siteMapNode> 
     <siteMapNode url="~/About.aspx" title="About" description=""></siteMapNode> 
     <siteMapNode url="" title="Admin Panel" description=""> 
      <siteMapNode url="~/Admin/AddPosts.aspx" title="Add Posts" description=""></siteMapNode> 
      <siteMapNode url="~/Admin/EditPosts.aspx" title="Edit Posts" description=""></siteMapNode> 
      <siteMapNode url="~/Admin/ApproveComments.aspx" title="Approve Comments" description=""></siteMapNode> 
     </siteMapNode> 
    </siteMapNode> 
</siteMap> 

母版頁

protected void Menu1_MenuItemDataBound(object sender, MenuEventArgs e) 
{ 
    if (!HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     System.Web.UI.WebControls.Menu menu = (System.Web.UI.WebControls.Menu)sender; 
     SiteMapNode mapNode = (SiteMapNode)e.Item.DataItem; 

     System.Web.UI.WebControls.MenuItem itemToRemove = menu.FindItem(mapNode.Title); 

     if (mapNode.Title == "Admin Panel") 
     { 
      System.Web.UI.WebControls.MenuItem parent = e.Item.Parent; 
      if (parent != null) 
      { 
       parent.ChildItems.Remove(e.Item); 
      } 
     } 
    } 
} 

標記

<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" 
     Orientation="Horizontal" onmenuitemdatabound="Menu1_MenuItemDataBound"> 
    </asp:Menu> 
    <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" 
     ShowStartingNode="False" /> 

我累了上面的代碼,但它無法正常工作。它看起來像「管理面板」的父項爲空。但我不知道如何修改它以使其工作。

我也試過一個簡單的版本:

Menu1.Items.RemoveAt(2); 

不知道爲什麼它給了我索引超出邊界錯誤。管理面板項目實際上是Menu1中的第三項。

任何幫助,將不勝感激。

+0

使用角色有什麼問題? –

+0

@matti。我只需要區分2類用戶(登錄/不登錄),所以我認爲HttpContext.Current.User.Identity.IsAuthenticated是有效 –

回答

6

可以這樣做2種方式:

標記:

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" 
       EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal" 
       DataSourceID="SiteMapDataSource1" 
       onmenuitemdatabound="NavigationMenu_MenuItemDataBound"> 
</asp:Menu> 
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" /> 

代碼:

protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e) 
{ 
    System.Web.UI.WebControls.Menu menu = (System.Web.UI.WebControls.Menu)sender; 
    SiteMapNode mapNode = (SiteMapNode)e.Item.DataItem; 

    if (mapNode.Title == "Admin Panel") 
    {    
     System.Web.UI.WebControls.MenuItem itemToRemove = menu.FindItem(mapNode.Title); 
     menu.Items.Remove(itemToRemove); 
    } 
} 

標記:

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" 
       EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal" 
       DataSourceID="SiteMapDataSource1" ondatabound="NavigationMenu_DataBound" > 
</asp:Menu> 
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" /> 

代碼:

protected void TopNavigationMenu_OnMenuItemDataBound(object sender, MenuEventArgs e) 
    { 
     System.Web.UI.WebControls.Menu menu = (System.Web.UI.WebControls.Menu)sender; 
     SiteMapNode mapNode = (SiteMapNode)e.Item.DataItem; 
     if (mapNode.Title == "Admin Dash" && currUser != null && currUser.UserGroups.FirstOrDefault(s=>s.GroupID == 0) == null) 
     { 
      System.Web.UI.WebControls.MenuItem itemToRemove = menu.FindItem("Compliance/Admin Dash"); 
      itemToRemove.Parent.ChildItems.Remove(itemToRemove); 
      // menu.Items.Remove(itemToRemove); 
     } 
    } 

請注意行:

protected void NavigationMenu_DataBound(object sender, EventArgs e) 
{ 
    ((System.Web.UI.WebControls.Menu)sender).Items.RemoveAt(2); 
} 
+0

我試過你的代碼,但它仍然不適合我。 –

+0

這是我的綁定的數據: 的

+0

至於我原來的方法,我更新了「標記」會話中的綁定代碼。謝謝 –

0

如果您嘗試在Menu1_MenuItemDataBound事件處理程序中使用Menu1.Items.RemoveAt(2);方法,我認爲您要遲到了。

您需要在之前執行此操作,例如在Page_Load事件中。

+0

感謝您的答覆。我也將它添加到頁面加載事件中。但它給了我同樣的錯誤。 –

1

由於其中itemToRemove距離它的父這樣你可能只是刪除它,你可能不知道itemToRemove.Parent.ChildItems.Remove( itemToRemove);