I know i been away but here is part three, this version checks your Asp_net role and the roles for a current node. Veri simple but the menu looks very cool
[Serializable()] public class CssMenu : Panel { private SiteMapDataSource xds; private string[] userRoles; private bool HasRoles(SiteMapNode item) { bool retval = false; foreach (string item2 in item.Roles) { if (item2.ToString().Equals("*")) retval = true; foreach (string item1 in userRoles) { if (item1.Equals(item2.ToString())) retval = true; } } return retval; } public SiteMapDataSource DataSource { get { return xds; } set { xds = value; } } /// /// /// public string CssId { get { if (ViewState["CssId"] == null) ViewState["CssId"] = ""; return (string)ViewState["CssId"]; } set { ViewState["CssId"] = value; } } /// /// /// public bool StartAtRoot { get { if (ViewState["StartAtRoot"] == null) return false; return (bool)ViewState["StartAtRoot"]; } set { ViewState["StartAtRoot"] = value; } } /// /// /// public string CssCurrentClass { get { if (ViewState["CssCurrentClass"] == null) ViewState["CssCurrentClass"] = ""; return (string)ViewState["CssCurrentClass"]; } set { ViewState["CssCurrentClass"] = value; } } /// /// /// public int ChildLevels { get { if (ViewState["ChildLevels"] == null) ViewState["ChildLevels"] = 1; return (int)ViewState["ChildLevels"]; } set { ViewState["ChildLevels"] = value; } } /// /// /// private void LoaChildsNodes(SiteMapNodeCollection smnc, ref Panel obj) { Literal lit = new Literal(); lit.Text = " "; obj.Controls.Add(lit); foreach (SiteMapNode item in smnc) { //if (this.HasRoles(item.Roles)) // { lit = new Literal(); lit.Text = "* "; obj.Controls.Add(lit); HyperLink lnk = new HyperLink(); lnk.Text = item.Title; lnk.NavigateUrl = item.Url; if (Page.Request.RawUrl.ToLower().Contains(item.Url.ToLower()) && (CssCurrentClass.Length > 0)) lnk.CssClass = CssCurrentClass; else lnk.CssClass = ""; obj.Controls.Add(lnk); lit = new Literal(); lit.Text = " "; obj.Controls.Add(lit); // } } lit = new Literal(); lit.Text = ""; obj.Controls.Add(lit); } protected override void OnDataBinding(EventArgs e) { base.Controls.Clear(); base.OnDataBinding(e); SiteMapNodeCollection smnc; userRoles = Roles.GetRolesForUser(); xds = this.DataSource; if (StartAtRoot) smnc = xds.Provider.GetChildNodes(xds.Provider.RootNode); else smnc = xds.Provider.GetChildNodes(xds.Provider.CurrentNode); Literal lit = new Literal(); lit.Text = ""; base.Controls.Add(lit); foreach (SiteMapNode item in smnc) { if (HasRoles(item)) { lit = new Literal(); lit.Text = " * "; base.Controls.Add(lit); HyperLink lnk = new HyperLink(); lnk.Text = item.Title; lnk.NavigateUrl = item.Url; if (Page.Request.RawUrl.ToLower().Contains(item.Url.ToLower()) && (CssCurrentClass.Length > 0)) { lnk.CssClass = CssCurrentClass; } else { lnk.CssClass = ""; } base.Controls.Add(lnk); SiteMapNodeCollection smc2 = xds.Provider.GetChildNodes(item); if ((this.ChildLevels > 1) && (smc2.Count > 0)) { Panel pn = new Panel(); lit = new Literal(); lit.Text = ""; pn.Controls.Add(lit); this.LoaChildsNodes(xds.Provider.GetChildNodes(item), ref pn); lit = new Literal(); lit.Text = ""; pn.Controls.Add(lit); base.Controls.Add(pn); } lit = new Literal(); lit.Text = ""; base.Controls.Add(lit); } } lit = new Literal(); lit.Text = ""; base.Controls.Add(lit); } }