This topic has not yet been rated Rate this topic

How to: Extend the Navigation Provider in SharePoint Server 2010 (ECM)

Published: May 2010

You can extend the navigation provider in Microsoft SharePoint Server 2010 by deriving a custom provider class from any of the default site map providers. Deriving from a SharePoint Server 2010 site map provider supplies several benefits, such as navigation node caching and security trimming. The following code example derives from the PortalSiteMapProvider class and demonstrates how to add items to the site map provider. Although the site map provider classes have approximately twenty abstract or virtual methods, only a small number must be overridden and implemented in a custom site map provider.

How to extend the navigation provider

  1. Create a Microsoft Visual C# class library project with the following code, add the required references, and then build the project.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SharePoint.Publishing;
    using Microsoft.SharePoint.Publishing.Navigation;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Configuration;
    
    namespace MyCustomNav
    {
    public class Navigation: PortalSiteMapProvider
    {
    public override SiteMapNodeCollection GetChildNodes(System.Web.SiteMapNode 
    node)
    {
    PortalSiteMapNode pNode = node as PortalSiteMapNode;
    if (pNode != null)
    {
    if (pNode.Type == NodeTypes.Area)
    {
    SiteMapNodeCollection nodeColl = base.GetChildNodes(pNode);
    SiteMapNode childNode = new SiteMapNode(this, 
    "<http://www.microsoft.com>", "<http://www.microsoft.com>", "Microsoft");
    
    SiteMapNode childNode1 = new SiteMapNode(this, 
    "<http://support.microsoft.com>", "<http://support.microsoft.com>", "Support");
    
    nodeColl.Add(childNode);
    
    SiteMapNodeCollection test = new SiteMapNodeCollection();
    test.Add(childNode1);
    childNode.ChildNodes = test;
    
    return nodeColl;
    }
    else
    return base.GetChildNodes(pNode);
    }
    else
    return new SiteMapNodeCollection();
    }
    }
    }
    
  2. Copy the .dll file that you created in step 1 into the SharePoint Server 2010 virtual directory’s bin folder.

  3. Create the following entry in the web.config file for the Web application, and then set the trust level to Full.

    <add name="MyCustomNavigationProvider" type="MyCustomNav.Navigation, MyCustomNav" 
    NavigationType="Current" />
    
    
  4. Create a custom master page, and then add the following code under the top navigation’s ContentPlaceHolder element.

    <SharePoint:AspMenu
    ID="TopNavigationMenu"
      Runat="server"
      DataSourceID="topSiteMap1"
      EnableViewState="false"
      AccessKey="<%$Resources:wss,navigation_accesskey%>"
      Orientation="Horizontal"
      StaticDisplayLevels="1"
      MaximumDynamicDisplayLevels="3"
      DynamicHorizontalOffset="0"
      StaticPopoutImageUrl="/_layouts/images/menudark.gif"
      StaticPopoutImageTextFormatString=""
      DynamicHoverStyle-BackColor="#CBE3F0"
      SkipLinkText=""
      StaticSubMenuIndent="0"
      CssClass="ms-topNavContainer">
    <StaticMenuStyle/>
    <StaticMenuItemStyle CssClass="ms-topnav" ItemSpacing="0px"/>
    <StaticSelectedStyle CssClass="ms-topnavselected" />
    <StaticHoverStyle CssClass="ms-topNavHover" />
    <DynamicMenuStyle BackColor="#F2F3F4" BorderColor="#A7B4CE" 
      BorderWidth="1px"/>
    <DynamicMenuItemStyle CssClass="ms-topNavFlyOuts"/>
    <DynamicHoverStyle CssClass="ms-topNavFlyOutsHover"/>
    <DynamicSelectedStyle CssClass="ms-topNavFlyOutsSelected"/>
    </SharePoint:AspMenu>
    <asp:SiteMapDataSource
      ShowStartingNode="False"
      SiteMapProvider="MyCustomNavigationProvider"
      id="topSiteMap1"
      runat="server"
      StartFromCurrentNode="true"/>
    
    
  5. Reset Microsoft Internet Information Server (IIS). Your SharePoint Server site should now show the updated navigation from the extended navigation provider.

Date

Description

Reason

May 2010

Initial publication

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
Web.config Entries
FYI, The web.config entry above goes in the <system.web><siteMap><providers> section and full trust is set by adding a <trust level="full" /> element to <system.web>.
Do you guys ever try your solutions first?
All i get is: The SiteMapProvider .... cannot be found.