2011-02-08 58 views
29

¿Puedo ocultar ciertos elementos del menú en un control asp:Menu basado en la función?¿Puedo ocultar/mostrar asp: elementos de menú basados ​​en la función?

<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> 

¿Cómo puedo hacer que uno de estos elementos sea visible solo para los usuarios en la función Admin? Uso el proveedor de roles asp.net.

Respuesta

22

Puede enlazar los elementos del menú a un mapa del sitio y utilizar el atributo de roles. Tendrá que habilitar el Recorte de seguridad en su Web.Config para hacer esto. Esta es la forma más simple.

sitio Navegación general: http://msdn.microsoft.com/en-us/library/e468hxky.aspx

recorte de seguridad Información: http://msdn.microsoft.com/en-us/library/ms178428.aspx

Mapa del Sitio Encuadernación Info: http://www.w3schools.com/aspnet/aspnet_navigation.asp

buen tutorial/Vista general aquí: 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

Otra opción que funciona , pero es menos ideal es utilice el control loginview que puede mostrar controles basados ​​en la función. Esta podría ser la opción más rápida (pero menos flexible/de rendimiento). Se puede encontrar una guía aquí: http://weblogs.asp.net/sukumarraju/archive/2010/07/28/role-based-authorization-using-loginview-control.aspx

26

Puede eliminar elementos de menú deseados en Load, así:

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); 
     } 
    } 

Estoy seguro de que hay una manera más ordenada para encontrar el artículo derecho a eliminar, pero éste trabajos. También puede agregar todos los elementos del menú deseado en un método Page_Load, en lugar de agregarlos en el marcado.

+0

simple y funciona perfectamente. +1 – Simon

+0

+1 para un enfoque excelente. –

+0

Esto se realiza mejor en MenuItemDataBound. Vea el ejemplo a continuación. –

13

Prefiero usar el método FindItem y usar la ruta de valor para localizar el elemento. Asegúrese de que su propiedad PathSeparator en el menú coincida con lo que está utilizando en el parámetro 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

Probablemente debería hacer lo anterior en el evento DataBound del menú en lugar de en Page_Load, ya que el evento DataBound se ejecutará cada vez que los datos estén vinculados al menú, lo que podría suceder después de Page_Load). –

0

Simplemente tiene que eliminar el menú principal en el evento page init.

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

Para eliminar un MenuItem de un ASP.net NavigationMenu por Value:

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); 
    } 
} 

y extensión helper:

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

y ejemplos de uso:

navigationMenu.RemoveMenuItemByValue("UnitTests"); 

Nota: Cualquier código se lanza al dominio público. No se requiere atribución.

0

para buscar elementos de menú en la base página de contenido en los roles

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

Esto se hace mejor en el 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); 
      }    
     } 
    } 
} 

Debido a que el ejemplo utiliza el NavigateUrl no es un lenguaje específico y trabaja en sitios con mapas de sitios localizados.

1

Prueba esto:

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

tengo mi menú en la página maestra del sitio. Usé la función Page_Load() para hacer que el elemento de menú "Admin" solo sea visible para los usuarios con una función de administrador.

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; 
      } 
     } 
    } 
} 
+0

pero este es un control telerik, no uno nativo asp.net uno! – Balaji

3

método simple puede no ser la mejor para todos los casos

 <%     
      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> 
     <% 
      }     
     %> 
+0

pon esto en el lado html de la página aspx –

Cuestiones relacionadas