Click here to Skip to main content
5,785,816 members and growing! (19,340 online)
Email Password   helpLost your password?
Web Development » ASP.NET » General     Intermediate

Using Multiple Sitemap Files in ASP.NET 2.0

By Doug Wilson

An article on how to use mutliple sitemap files for your site navigation.
C#, XML, Windows, .NET 2.0, .NET, ASP.NET, Visual Studio, VS2005, Dev

Posted: 10 Jan 2006
Updated: 10 Jan 2006
Views: 60,345
Bookmarked: 45 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
17 votes for this Article.
Popularity: 5.12 Rating: 4.16 out of 5
2 votes, 11.8%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
3 votes, 17.6%
4
12 votes, 70.6%
5

Introduction

ASP.NET 2.0 comes with bindable site navigation out of the box in the form of sitemap files. By including a web.sitemap file in the root directory of your website, you can easily bind your navigation control to the sitemap file. But what about placing your sitemap files in app_data (so that they can't be downloaded), or having multiple nav bars and wanting a sitemap file for each of them. This article should give you a good start to overcoming these functionality limitations.

Using the code

The attached project takes the following requirements into consideration. The site has three different areas, a public section for web browsers, a secure section for members, and an administration section. The Secure and Administration sections reside in their own folders so the locations can be secured at a later date. For each section, we have created a master file (located in the masters folder) for consistent look and feel across the section. Each master file will also have its own navigation bar, and will need to bind to its own sitemap file (because the navigation items available in each section will be different). We've placed these sitemap files into the App_Data folder, to prevent them from being downloaded by visitors and spiders.

We now need a way to populate each of these navigation bars with the appropriate sitemap file. This functionality has been abstracted into a user control (UserControls/Menu.ascx), to isolate the logic from the rest of the system.

In the user control, we create a public enum, to represent the different menus available.

public enum SiteMapMenus
{
    Admin, Secure, Public, NotSet
}

I then created a public property to set the menu type at design time.

SiteMapMenus eMenuToLoad = SiteMapMenus.NotSet;
public SiteMapMenus MenuToLoad
{
    get { return eMenuToLoad; }
    set { eMenuToLoad = value; }
}

Now, for the crux of the code. Each menu can accept an XMLDataSource to bind to. The GetMenuDataSource method reads the required sitemap file as an XML file, then creates and returns a data source that can be bound to the control.

XmlDataSource GetMenuDataSource(SiteMapMenus menu, 
                             string serverMapPath)
{
    XmlDataSource objData = new XmlDataSource();
    objData.XPath = "siteMap/siteMapNode";
    switch (menu)
    {
        case SiteMapMenus.Admin:
            objData.DataFile = serverMapPath + @"\App_Data\Admin.sitemap";
            break;
        case SiteMapMenus.Secure:
            objData.DataFile = serverMapPath + @"\App_Data\Secure.sitemap";
            break;
        case SiteMapMenus.Public:
            objData.DataFile = serverMapPath + @"\App_Data\public.sitemap";
            break;
        default:
            break;
    }
    objData.DataBind();
    return objData;
}

We are now almost ready to bind our datasource, but first, as the data source is now XML, and not in the format returned from the sitemap provider, we need to setup our databindings on the menu control itself, as shown below:

<asp:Menu ID="Menu1" runat="server">
    <DataBindings> 
        <asp:MenuItemBinding DataMember="siteMapNode" 
             TextField="title" NavigateUrlField="url"  /> 
    </DataBindings> 
</asp:Menu>

We can now finally bind the source to the control, and this is all fired off in the Page_Load event handler of the User Control.

protected void Page_Load(object sender, EventArgs e)
{
    Menu1.DataSource = GetMenuDataSource(eMenuToLoad, 
                                Server.MapPath("~"));
    Menu1.DataBind();
}

Using our new menu is now as easy as registering the user control on the page, and specifying which menu to display by setting the MenuToLoad property.

<DW:MyMenu ID="MyMenu1" runat="server" MenuToLoad="Secure" />

Something to Note

It is important to point out that for each field specified in your bindings on the menu control, there must be a corresponding item on every node in the sitemap file. For instance, in the attached sitemap files, top level nodes need not have a URL. However, the URL field is still present, and is blank. Removing the URL field from this node will cause a binding exception to be thrown.

I hope you will find this article informative and interesting.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Doug Wilson


Doug is an Applications Integrator for an online gaming company. He has been programming for 9 years, and has been working with the .NET framework since the beginning of 2003, in both VB.NET & C#.
Occupation: Web Developer
Location: South Africa South Africa

Other popular ASP.NET articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 18 of 18 (Total in Forum: 18) (Refresh)FirstPrevNext
GeneralCheck this guy's blog - seems easiermemberwgcampbell8:03 19 Nov '07  
GeneralRe: Check this guy's blog - seems easiermemberJamie Nordmeyer13:27 6 Aug '08  
GeneralMenu does not appearmemberProp Top5:06 11 Oct '07  
Generalitem.Selected DOES NOT WORKmemberGreekShowPony21:18 13 Mar '07  
QuestionIs this possible??memberjfoju18:08 14 Feb '07  
GeneralCan we use the same way for implmentation in the SiteMapPath control.membertmiku0:16 20 Dec '06  
GeneralXPath expressionmemberM. Niyazi5:08 10 Dec '06  
QuestionMenu User Controlmemberkiwimah14:40 6 Sep '06  
AnswerRe: Menu User ControlmemberYosefDov3:59 3 Oct '06  
QuestionRe: Menu User Controlmembermanishsawant3:24 3 May '07  
AnswerRe: Menu User Controlmemberkiwimah18:21 3 May '07  
GeneralAlready built in?memberMcGiv4:53 8 Mar '06  
GeneralRe: Already built in?memberRed Feet1:16 6 Oct '06  
GeneralRe: Already built in?memberDevinmccloud22:25 5 May '07  
GeneralsecurityTrimmingEnabled Featuremembersoccerchick10:40 7 Mar '06  
GeneralVB.net version of the codememberranbeer210:55 31 Jan '06  
GeneralCheck Roles attribute?memberAbishek Bellamkonda17:45 23 Jan '06  
GeneralRe: Check Roles attribute?memberDoug Wilson0:33 25 Jan '06  

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

PermaLink | Privacy | Terms of Use
Last Updated: 10 Jan 2006
Editor: Smitha Vijayan
Copyright 2006 by Doug Wilson
Everything else Copyright © CodeProject, 1999-2009
Web15 | Advertise on the Code Project