Click here to Skip to main content
6,295,667 members and growing! (9,570 online)
Email Password   helpLost your password?
Web Development » ASP » XML/XSL     Intermediate License: The Code Project Open License (CPOL)

Navigation Menu with XML Datasource (ASP.NET Server Control)

By Enes Gundogmus

Navigation menu using XML as data source: ASP.NET Server Control
XML, C# 3.0.NET 3.5, ASP.NET, Dev
Posted:9 Aug 2008
Updated:13 Aug 2008
Views:23,102
Bookmarked:25 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
9 votes for this article.
Popularity: 3.76 Rating: 3.94 out of 5
1 vote, 11.1%
1

2
1 vote, 11.1%
3
4 votes, 44.4%
4
3 votes, 33.3%
5
menu1.jpg

Introduction

Throughout my Web designing days, I always needed navigation menus with dynamic content which are also easily editable and customizable. Last month, I decided to write a simple menu control which uses CSS to style and uses XML as source for menu items.

Navigation Menu Server Control

<?xml version="1.0" encoding="utf-8" ?>

<menuitems>
  <item id="1" url="Default.aspx" linkname="Main Page"
      description="Main Page of web siter"/>
  <item id="2" url="Default2.aspx" linkname="Company" description="Company Details"/>
  <item id="3" url="Default3.aspx" linkname="Photos" description="Photo Gallery"/>
  <item id="4" url="Default4.aspx" linkname="Contact" description="Contact Form"/>
</menuitems>

This is the XML template for menu items and links

From the Visual Studio menu follow the tree: File - New - Project - Web - ASP.NET Server Control, and create a new server control project. By default ServerControl1.cs is installed. Right click the project and add a new Class called xmlreader.cs In this class first of all we define an object that represents menu item. Let's call it menuitem for simplicity's sake.

using System.Linq;
using System.Xml;
using System.Xml.Linq;
using System.Text;
using System.Collections;

public class menuitem
{
    public menuitem() { }
    private string id; //id of item
    private string url; // url for menu link
    private string linkname; //name of the link that will be displayed
    private string description;  // description displayed when mouse hover

    public string Id { get { return id; } set { id = value; } }
    public string Url { get { return url; } set { url = value; } }
    public string Linkname { get { return linkname; } set { linkname = value; } }
    public string Description { get { return description; } 
        set { description = value; } }
}

After defining menuitem we will create an instance of an arraylist class called getMenu into the xmlreader class. In the getMenu method, we read XML with XLINQ. This method takes two parameters:

  • path
  • xmlFilename
public ArrayList getMenu(string xmlPath, string xmlFileName)
{
    //array List to get menu items from xml
    ArrayList menuitems = new ArrayList();
    try
    {
        XElement xmenu = XElement.Load(xmlPath + xmlFileName);
        if (xmenu != null)
        {
            //get data from xml for menu items using XLINQ
            var xc = from c in xmenu.Elements("item")
            orderby c.Attribute("id").Value
            select new
                {
                ID = c.Attribute("id"),
                URL = c.Attribute("url"),
                LINKNAME = c.Attribute("linkname"),
                DESCRIPTION = c.Attribute("description")
                };
            foreach (var l in xc)
            {
                menuitem itm = new menuitem();
                //item id
                itm.Id = l.ID.Value;
                //menu item url
                itm.Url = l.URL.Value;
                //menu item name
                itm.Linkname = l.LINKNAME.Value;
                //menu description
                itm.Description = l.DESCRIPTION.Value;
                menuitems.Add(itm);
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    //return menu items
    return menuitems;
}

In the above methods, we created an arraylist. Now we have to create our HTML code. To do this we go to the ServerControl1.cs class.

The menuHtmlGenerator method is the one that takes items in the arraylist we build with getMenu in xmlreader and creates the markup code for HTML page.

    protected string menuHtmlGenerator(ArrayList aList)
    {
        StringBuilder s = new StringBuilder();
        
        //looping through Arraylist collection of Links.
        for (int i = 0; i < aList.Count; i++)
        {
            s.Append(System.Environment.NewLine);
            
            s.Append("<li >");

            s.Append("<a href ='" + ((menuitem)aList[i]).Url + "' ");
    
            s.Append("title='" + ((menuitem)aList[i]).Description + "' ");
        
            //if menu will show different class for currently selected item
            if (useDiffCssForCrrntItem)
            {
                if (((menuitem)aList[i]).Id == currentItemId)
                s.Append("class='" + currentItemClass + "' ");
            }
    
            s.Append(">");
        
            s.Append("<span>" + ((menuitem)aList[i]).Linkname + "</span> ");
    
            s.Append("</a>");

            s.Append("</li>");

            s.Append(System.Environment.NewLine);
        }
        //Return Full HTML Code As String
        return s.ToString();
    }
}

After generating HTML code we use a method derived from WebControl. In the method, the first thing we do is declare properties of the menu. They will be used as design-time attributes to customize the control.

public class ServerControl1 : WebControl
{
    #region 7 properties for design-time attritubes

    private string xmlPath; // xml file path
    private string xmlFileName; // xmlfile name
    private string menuClass; // CSS class to ship the menu
    private string menuId;  // main div id that will surround menu
    //  will menu show selected link differently?
    private bool useDiffCssForCrrntItem = false;       
    private string currentItemClass; //currently selected item's class
    private string currentItemId; //id that will determine which item is selected

    #endregion

    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue("")]
    [Localizable(true)]
    #region 4 Member properties Used as Design-Time Attributes for 
        Our Server Control

    public string XmlPath { get { return xmlPath; } set { xmlPath = value; } }
    public string XmlFileName { get { return xmlFileName; } 
    set { xmlFileName = value; } }
    public string MenuClass { get { return menuClass; } 
        set { menuClass = value; } }
    public string MenuId { get { return menuId; } 
        set { menuId = value; } }
    public bool UseDiffCssForCrrntItem { get { return useDiffCssForCrrntItem; } 
        set { useDiffCssForCrrntItem = value; } }
    public string CurrentItemClass { get { return currentItemClass; } 
        set { currentItemClass = value; } }
    public string CurrentItemId { get { return currentItemId; } 
        set { currentItemId = value; } }
    #endregion

    //render method. THIS IS MAIN METHOD WHERE ALL THE HTML CODE IS GENERATED AND
    //PASSED TO HTML PAGE

    protected override void RenderContents(HtmlTextWriter output)
    {
        try
        {
            // make instance from Data Class
            xmlreader myData = new xmlreader();
            //Write menu div
            output.Write("<div class='" + menuClass + "' id='" + menuId + "'>");
            //Open Ul Tag
            output.Write("<ul>");
            //write the Links Tag which is returned by GetNew(connectionStr) Method
            //menuHtmlGenerator method is explained below
            output.Write(menuHtmlGenerator(myData.getMenu(xmlPath, xmlFileName)));
            //ul Close Tag
            output.Write("</ul>");
            //div Close Tags
            output.Write("</d i v></div>");
        }
        catch (Exception ex)
        {
            output.Write(ex);
        }
    }

After we build our project in Visual Studio, right click the head of the toolbox and click Choose Items and select DLL file from the bin folder.

menu2.jpg

After that, drag and drop the new item to the page. Set the properties. Prepare the XML file which is in the sample project.

Points of Interest

This menu control is a sample of what you can do with server controls. They are powerful and fast.

History

  • 8th August, 2008: Initial version

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Enes Gundogmus


Member
Software Architect
Occupation: Software Developer
Company: KuantumSoft
Location: Turkey Turkey

Other popular ASP articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 7 of 7 (Total in Forum: 7) (Refresh)FirstPrevNext
GeneralGet error when created a example Pinmembercoldsun8:24 24 Oct '08  
QuestionHow about generating your menu (with the xml Ds) on the client-side? PinmemberGuillaume Leparmentier23:06 13 Aug '08  
AnswerRe: How about generating your menu (with the xml Ds) on the client-side? PinmemberEnes Gundogmus9:52 14 Aug '08  
GeneralTest project Pinmemberpaulsoren11:04 11 Aug '08  
Generalsample xml file for menu PinmemberEnes Gundogmus11:40 11 Aug '08  
QuestionRe: Test project Pinmemberandii56783:16 12 Aug '08  
Answercss sample - images for menu backgrounds are not included. PinmemberEnes Gundogmus3:22 12 Aug '08  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 13 Aug 2008
Editor: Sean Ewington
Copyright 2008 by Enes Gundogmus
Everything else Copyright © CodeProject, 1999-2009
Web15 | Advertise on the Code Project