ASP.NET 2.0 Menu - Einträge zur Laufzeit löschen

Written on March 10, 2006

Das ist ASP.NET 2.0 Menu-Control ist bereits sehr mächtig - insbesondere in Verbindung mit den .SiteMap-Files.

Nichtsdestotrotz hat man unter Umständen Kriterien, bei deren Eintreten man bestimmte Menü-Items nicht anzeigen möchte.

Generell erledigt man dies am einfachsten im ItemDataBound-Event des Menu-Controls - allerdings hat e.Item keine Eigenschaft .Visible oder gar eine .Remove-Methode. Der folgende Code zeigt (am Beispiel von Rollen via XmlDataSource, via SiteMap natürlich einfacher zu lösen - aber es geht um das Prinzip ;-)) , wie man das Problem trotzdem leicht lösen kann:

protected void Menu1_MenuItemDataBound(object sender, MenuEventArgs e) {
    System.Xml.XmlElement menuItem = (System.Xml.XmlElement)e.Item.DataItem;
    foreach (XmlAttribute att in menuItem.Attributes) {
        if (att.Name.ToLower() == "roles") {
            string roles = att.Value;
            string[] arrRoles = roles.Split(",".ToCharArray());
            for (int count = 0; count <= arrRoles.Length - 1; count++) {
                if (!Page.User.IsInRole(arrRoles[count])) {
                    Menu1.Items.Remove(e.Item);
                }
            }
        }
    } 
}

Das entsprechende Xml-File (vereinfacht):

<?xml version="1.0" encoding="utf-8"?>
<Menu>
    <Entry Text="Home" URL="~/default.aspx" />
    <Entry Text="Registrieren" URL="~/register.aspx" />
    <Entry Text="Seiten bearbeiten" URL="~/content.aspx" roles="Administrators" />
    <Entry Text="Benutzerprofil" URL="~/profile.aspx" />
    <Entry Text="Benutzerverwaltung" URL="~/users.aspx" roles="Administrators" />
<Menu>