XML Menu UserControl (ASP.NET)
A UserControl for ASP.NET that displays a menu generated from an XML file. Very basic. If the XML file is missing (or not valid XML markup) nothing renders.
UserControl: menu.ascx
<%@ Control Language="C#" src="menu.ascx.cs" Inherits="Menu" %> <asp:Repeater runat="server" id="rptMenu"> <HeaderTemplate> <ul> </HeaderTemplate> <ItemTemplate> <li><asp:HyperLink runat="server" Tooltip='<%# DataBinder.Eval(Container.DataItem, "Tooltip") %>' NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "NavigateUrl") %>' Text='<%# DataBinder.Eval(Container.DataItem, "Text") %>' /></li> </ItemTemplate> <FooterTemplate> </ul> </FooterTemplate> </asp:Repeater>
Code Behind: menu.ascx.cs
using System; using System.Data; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Xml; public class Menu : UserControl { #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); } #endregion // the xml file to load the data from public string XmlFile = "menu.xml"; // data table for storing menu data protected DataTable MenuData; // menu repeater protected Repeater rptMenu; private void Page_Load(object sender, EventArgs e) { SetupDataTable(); if (!Page.IsPostBack) { SetupMenu(); } } // sets up the data table that is to be bound to the repeater private void SetupDataTable() { MenuData = new DataTable(); MenuData.Columns.Add(new DataColumn("Text", System.Type.GetType("System.String"))); MenuData.Columns.Add(new DataColumn("NavigateUrl", System.Type.GetType("System.String"))); MenuData.Columns.Add(new DataColumn("Tooltip", System.Type.GetType("System.String"))); } private void SetupMenu() { DataRow NewRow; XmlTextReader reader = null; try { reader = new XmlTextReader(MapPath(ResolveUrl(XmlFile))); // ignore whitespace reader.WhitespaceHandling = WhitespaceHandling.None; // move to first node reader.MoveToContent(); // loop until there is nothing left to read and the end node hasn't been reached while (reader.Read()) { // if current node is not menu item, move to next node if(reader.Name != "MenuItem") continue; // if same as current page, move to next node if(SameAsCurrent(reader.GetAttribute("page"))) continue; NewRow = MenuData.NewRow(); NewRow["Text"] = reader.GetAttribute("text"); NewRow["NavigateUrl"] = reader.GetAttribute("page"); NewRow["Tooltip"] = reader.GetAttribute("tooltip"); MenuData.Rows.Add(NewRow); } // close reader reader.Close(); // set datasource to populated data table and bind rptMenu.DataSource = MenuData; rptMenu.DataBind(); } catch (System.Exception ex) { // close reader if error has occured if (reader != null) { reader.Close(); } Trace.Write(ex.Source,ex.Message); } } // same as current page private bool SameAsCurrent(string page) { // use RawUrl to include query string when resolving, Path to exclude it return ResolveUrl(page)==ResolveUrl(HttpContext.Current.Request.Path); } }
Menu Items: test.xml
<?xml version="1.0" encoding="utf-8"?> <Menu> <MenuItem page="~/1.aspx" tooltip="Tooltip 1" text="Item 1" /> <MenuItem page="~/2.aspx" tooltip="Tooltip 2" text="Item 2" /> <MenuItem page="~/3.aspx" tooltip="Tooltip 3" text="Item 3" /> </Menu>
Test Page: menutest.aspx
<%@ Page Language="C#" %> <%@ Register TagPrefix="Menu" TagName="Test" src="menu.ascx" %> <script runat="server"> private void DoPostBack(object sender, EventArgs e) { MyLabel.Text = "Posted back"; } </script> <html> <head> <title>XML Menu</title> </head> <body> <form runat="server"> <Menu:Test XmlFile="test.xml" runat="server" /> <asp:Button runat="server" OnClick="DoPostBack" Text="Button" /> <asp:Label id="MyLabel" runat="server" /> </form> </body> </html>
Comments
Just shows how you can parse XML with ASP.NET and display the contents in menu form. Rather than editing the page to add new items, just edit the XML file. As it is a UserControl it can be used on multiple pages.
Could this be used to make a dropdown menu and how would you do it..
Lasse/Denmark