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>