2011-02-08 96 views
29

我可以根據角色隱藏某個asp:Menu控件中的某些菜單項嗎?我可以隱藏/顯示asp:基於角色的菜單項嗎?

<asp:Menu ID="mTopMenu" runat="server" Orientation="Horizontal" /> 
    <Items> 
     <asp:MenuItem Text="File"> 
      <asp:MenuItem Text="New Project" /> 
      <asp:MenuItem Text="Release Template" NavigateUrl="~/Release/ReleaseTemplate.aspx" /> 
      <asp:MenuItem Text="Release Schedule" NavigateUrl="~/Release/ReleaseSchedule.aspx" /> 
      <asp:MenuItem Text="Roles" NavigateUrl="~/Admin/AdminRoles.aspx" /> 
     </asp:MenuItem> 
    </Items> 
</asp:Menu> 

如何讓這些項目中的其中一個僅對Admin角色的用戶可見? 我正在使用asp.net角色提供程序。

回答

22

您可以將菜單項綁定到站點地圖並使用角色屬性。您需要在您的Web.Config中啓用安全修整來執行此操作。這是最簡單的方法。

網站導航概述: http://msdn.microsoft.com/en-us/library/e468hxky.aspx

的安全調整信息: http://msdn.microsoft.com/en-us/library/ms178428.aspx

網站地圖綁定信息: http://www.w3schools.com/aspnet/aspnet_navigation.asp

好的教程/概述這裏: http://weblogs.asp.net/jgalloway/archive/2008/01/26/asp-net-menu-and-sitemap-security-trimming-plus-a-trick-for-when-your-menu-and-security-don-t-match-up.aspx

另一種選擇,工程,但不太理想的是使用登錄視圖控件可以顯示基於角色的控件。這可能是最快的(但最不靈活/高性能)選項。您可以在這裏找到一個指南:http://weblogs.asp.net/sukumarraju/archive/2010/07/28/role-based-authorization-using-loginview-control.aspx

26

您可以在Page_Load中刪除不需要的菜單項,如:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Roles.IsUserInRole("Admin")) 
     { 
      MenuItemCollection menuItems = mTopMenu.Items; 
      MenuItem adminItem = new MenuItem(); 
      foreach (MenuItem menuItem in menuItems) 
      { 
       if (menuItem.Text == "Roles") 
        adminItem = menuItem; 
      } 
      menuItems.Remove(adminItem); 
     } 
    } 

我敢肯定有找到刪除右邊的項目一個更合適的方法,但是這一次作品。您也可以將所有需要的菜單項添加到Page_Load方法中,而不是將其添加到標記中。

+0

簡單和完美的作品。 +1 – Simon 2011-04-29 16:15:18

+0

+1爲一個很好的方法。 – 2012-10-30 12:46:53

+0

這最好在MenuItemDataBound中完成。見下面的例子。 – 2013-04-15 20:10:39

13

我更喜歡使用FindItem方法並使用值路徑來查找該項目。確保菜單上的PathSeparator屬性與您在FindItem參數中使用的內容相匹配。

protected void Page_Load(object sender, EventArgs e) 
    { 

     // remove manage user accounts menu item for non-admin users. 
     if (!Page.User.IsInRole("Admin")) 
     { 
      MenuItem item = NavigationMenu.FindItem("Users/Manage Accounts"); 
      item.Parent.ChildItems.Remove(item); 
     } 

    } 
+0

您應該在Menu的DataBound事件中而不是在Page_Load中執行上述操作,因爲每次數據綁定到菜單時都會運行DataBound事件,這可能發生在Page_Load之後)。 – 2013-10-03 17:41:37

0

您只需在頁面初始化事件中刪除父菜單。

Protected Sub navMenu_Init(sender As Object, e As System.EventArgs) Handles navMenu.Init 
    'Remove the admin menu for the norms 
    Dim cUser As Boolean = HttpContext.Current.User.IsInRole("Admin") 

    'If user is not in the Admin role removes the 1st menu at index 0 
    If cUser = False Then 
     navMenu.Items.RemoveAt(0) 
    End If 
End Sub 
1

爲了通過Value從ASP.net NavigationMenu移除MenuItem

public static void RemoveMenuItemByValue(MenuItemCollection items, String value) 
{ 
    MenuItem itemToRemove = null; 

    //Breadth first, look in the collection 
    foreach (MenuItem item in items) 
    { 
     if (item.Value == value) 
     { 
      itemToRemove = item; 
      break; 
     } 
    } 

    if (itemToRemove != null) 
    { 
     items.Remove(itemToRemove); 
     return; 
    } 


    //Search children 
    foreach (MenuItem item in items) 
    { 
     RemoveMenuItemByValue(item.ChildItems, value); 
    } 
} 

和輔助擴展:

public static RemoveMenuItemByValue(this NavigationMenu menu, String value) 
{ 
    RemoveMenuItemByValue(menu.Items, value); 
} 

和示例用法:

navigationMenu.RemoveMenuItemByValue("UnitTests"); 

注意:任何代碼被釋放到公共領域。無需歸屬。

0

要查找的角色

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Session["AdminSuccess"] != null) 
     { 
      Menu mainMenu = (Menu)Page.Master.FindControl("NavigationMenu"); 

    //you must know the index of items to be removed first 
    mainMenu.Items.RemoveAt(1); 

    //or you try to hide menu and list items inside menu with css 
    // cssclass must be defined in style tag in .aspx page 
    mainMenu.CssClass = ".hide"; 

     } 

} 

<style type="text/css"> 
.hide 
    { 
     visibility: hidden; 
    } 
    </style> 
9

這是最好的MenuItemDataBound做過內容頁面基地的菜單項。

protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e) 
{ 
    if (!Page.User.IsInRole("Admin")) 
    { 
     if (e.Item.NavigateUrl.Equals("/admin")) 
     { 
      if (e.Item.Parent != null) 
      { 
       MenuItem menu = e.Item.Parent; 

       menu.ChildItems.Remove(e.Item); 
      } 
      else 
      { 
       Menu menu = (Menu)sender; 

       menu.Items.Remove(e.Item); 
      }    
     } 
    } 
} 

由於該示例使用了NavigateUrl,因此它不是語言特定的,並且可以在具有本地化站點地圖的站點上運行。

1

試試這個:

protected void Menu1_DataBound(object sender, EventArgs e) 
{ 
    recursiveMenuVisit(Menu1.Items); 
} 

private void recursiveMenuVisit(MenuItemCollection items) 
     { 
      MenuItem[] itemsToRemove = new MenuItem[items.Count]; 
      int i = 0; 

      foreach (MenuItem item in items) 
      { 
       if (item.NavigateUrl.Contains("Contact.aspx")) 
       { 
        itemsToRemove[i] = item; 
        i++; 
       } 
       else 
       { 
        if (item.ChildItems.Count > 0) recursiveMenuVisit(item.ChildItems); 
       } 
      } 

      for(int j=0; j < i; j++) 
      { 
       items.Remove(itemsToRemove[j]); 
      } 
     } 
0

我有我的網站母版頁菜單。我使用Page_Load()函數使「Admin」菜單項只對具有Admin角色的用戶可見。

using System; 
using System.Linq; 
using Telerik.Web.UI; 
using System.Web.Security; 



<telerik:RadMenu ID="menu" runat="server" RenderMode="Auto" > 
    <Items> 
     <telerik:RadMenuItem Text="Admin" Visible="true" /> 
    </Items> 
</telerik:RadMenu> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     RadMenuItem item = this.menu.FindItemByText("Admin"); 
     if (null != item) 
     { 
      if (Roles.IsUserInRole("Admin")) 
      { 
       item.Visible = true; 
      } 
      else 
      { 
       item.Visible = false; 
      } 
     } 
    } 
} 
3

SIMPLE方法可能不是最適合所有的情況下

 <%     
      if (Session["Utype"].ToString() == "1") 
      { 
     %> 
     <li><a href="../forms/student.aspx"><i class="fa fa-users"></i><span>STUDENT DETAILS</span></a></li> 
     <li><a href="../forms/UserManage.aspx"><i class="fa fa-user-plus"></i><span>USER MANAGEMENT</span></a></li> 
     <% 
       } 
      else 
      { 
     %>      
     <li><a href="../forms/Package.aspx"><i class="fa fa-object-group"></i><span>PACKAGE</span></a></li> 
     <% 
      }     
     %>