Jacob Khan
Jan 3, 2013
  10848
(5 votes)

Menu Provider for EPiServer Top Navigation

There are lot of great blog posts regarding how to add something to the top level navigation in EPiServer.

http://www.dnasir.com/2012/05/15/episerver-cms-custom-top-menu-for-multiple-plugins/

http://world.episerver.com/Blogs/Dung-Le/Dates/2010/2/Create-Global-Navigation-in-EPiServer-CMS-6-RC1/

http://world.episerver.com/Documentation/Items/Tech-Notes/EPiServer-CMS-6/EPiServer-CMS-60/OnlineCenter-Developer-Documentation/

It is extremely flexible and powerful. One small thing that we often encounter is that we want to reuse the menu on the top and want to include the new script files and styles needed for CMS 7 when we create plugins.

Accomplishing this is extremely easy. First we need to add four import statements in our markup.

<%@ Import Namespace="EPiServer.Framework.Web.Resources" %>
<%@ Import Namespace="EPiServer.Framework.Web.Mvc.Html" %>
<%@ Import Namespace="EPiServer" %>

We also need to register our Menu User Control

<%@ Register TagPrefix="sc" Assembly="EPiServer.Shell" Namespace="EPiServer.Shell.Web.UI.WebControls" %>

In the head tag of our ASPX we need to add our styles

<asp:PlaceHolder ID="shellScripts" runat="server">
            <%=Page.ClientResources("Dojo", new[] 
{ ClientResourceType.Style })%> <%=Page.ClientResources("ShellCore")%> <%=Page.ClientResources("ShellWidgets")%> <%=Page.ClientResources("ShellCoreLightTheme")%> <%=Page.ClientResources("ShellWidgetsLightTheme")%> <%=Page.ClientResources("Navigation")%> </asp:PlaceHolder>

We also need to add our Menu to the page, after that we are done

 <div class="epi-globalNavigationContainer">
        <sc:ShellMenu ID="ShellMenu2" runat="server" SelectionPath="/global/fb/main" />
    </div>

I used a MenuProvider since I dont really like making web.config changes.

 [MenuProvider]
    public class MenuProvider : IMenuProvider
    {
        public IEnumerable<MenuItem> GetMenuItems()
        {
            SectionMenuItem sectionMenuItem = new SectionMenuItem("Facebook", "/global/fb");
            sectionMenuItem.IsAvailable = ((RequestContext request) => PrincipalInfo.Current.HasPathAccess(UriSupport.Combine("/Facebook", "")));
            SectionMenuItem sectionMenuItem2 = sectionMenuItem;
            UrlMenuItem urlMenuItem = new UrlMenuItem("Main", "/global/fb/main", "/modules/TopBarPlugin/MainMenuPlugin.aspx");
            urlMenuItem.IsAvailable = ((RequestContext request) => true);
            urlMenuItem.SortIndex = 100;
            UrlMenuItem urlMenuItem2 = urlMenuItem;
           
            return new MenuItem[]
            {
                sectionMenuItem2, 
                urlMenuItem2
            };
        }
    }

Screen Shot 2013-01-02 at 2.40.41 PM

I am attaching my files in case someone wants the entire code

Jan 03, 2013

Comments

Petri Isola
Petri Isola Jan 4, 2013 11:51 AM

Nice article.

Jan 4, 2013 08:01 PM

The import statements in the example in this post and in the downloadable code differs. The downloadable code is correct, because the ClientResources-extension method has been moved from namespace EPiServer.Shell.Navigation to EPiServer.Framework.Web.Mvc.Html.

Jacob Khan
Jacob Khan Jan 5, 2013 12:10 AM

@Andreas, I changed it, thanks

Please login to comment.
Latest blogs
Optimizely CMS 13 and the first bug fixes

The first bug fixes for Optimizely CMS 13 is here!

Tomas Hensrud Gulla | Apr 9, 2026 |

Running the Optimizely CMS 13 Alloy Site on macOS with Docker

In my first Apple Silicon post and the 2025 revisit I covered running an Optimizely Foundation site on an M1/ARM Mac. This time I wanted to try...

Stanisław Szołkowski | Apr 9, 2026 |

Stott Security v7 for Optimizely CMS 13

Stott Security version 7 is now available for  Optimizely PaaS CMS 13 , introducing support for configuring security headers by both  application...

Mark Stott | Apr 9, 2026

Optimizely CMS 13 and errors when creating pages after upgrade

After upgrading to Optimizely CMS 13, I ran into issues creating pages and deleting media. The fix was easy!

Tomas Hensrud Gulla | Apr 9, 2026 |