Skip Ribbon Commands
Skip to main content

SharePoint Cross Site Collection Common Top Navigation

 

James Strugnell

14/03/2012

A recent requirement was called for a SharePoint solution that would allow for cross site collection navigation in large farms.

The main issue was the administration of the navigation as there were 20+ site collections meaning that they all had to be changed one by one. This raised a few issues, time, effort required and consistency.

The farm used a common master page though-out, but they wanted a number of site collections to use the out of the box navigation and then others to use the common navigation.
The solution we came up with was to utilise the ASP.Net site map provider with the SharePoint navigation control within the master page. This solved the problem of having multiple places to edit, but raised a few new ones. As the navigation would not change often this was not a big problem, but it was the ability to change the navigation. Every time you would want to change the navigation then a solution upgrade would have to be performed.

The following is how to implement this as a Visual studio solution:

1. Create a copy of your existing masterpage and add it to the project.

2. Create Assets folder then a folder called Masterpages add the masterpage here.

3. On the Master Page find the following control.

<asp:ContentPlaceHolder id="PlaceHolderTopNavBar" runat="server">

         <asp:ContentPlaceHolder id="PlaceHolderHorizontalNav" runat="server">

                 <SharePoint:AspMenu

                          ID="TopNavigationMenuV4"

                          Runat="server"

                          EnableViewState="false"

                          DataSourceID="topSiteMap"

                          AccessKey="<%$Resources:wss,navigation_accesskey%>"

                          UseSimpleRendering="true"

                          UseSeparateCss="false"

                          Orientation="Horizontal"

                          StaticDisplayLevels="2"

                          MaximumDynamicDisplayLevels="2"

                          SkipLinkText=""

                          CssClass="s4-tn"/>

                  <SharePoint:DelegateControl runat="server" ControlId="TopNavigationDataSource" Id="topNavigationDelegate">

                          <Template_Controls>

                                   <asp:SiteMapDataSource

                                            ShowStartingNode="False"

                                            SiteMapProvider="SPNavigationProvider"

                                            id="topSiteMap"

                                            runat="server"

                                            StartingNodeUrl="sid:1002"/>

                          </Template_Controls>

                 </SharePoint:DelegateControl>

         </asp:ContentPlaceHolder>

</asp:ContentPlaceHolder> 

4. Replace the above code with this:

            <asp:ContentPlaceHolder id="PlaceHolderTopNavBar" runat="server">
            
                        
            <asp:ContentPlaceHolder id="PlaceHolderHorizontalNav" runat="server">
            
                                
            <SharePoint:AspMenu
            
                                         
            ID="TopNavigationMenuV4"
            
                                         
            Runat="server"
            
                                         
            EnableViewState="false"
            
                                         
            DataSourceID="topSiteMap"
            
                                         
            AccessKey="<%$Resources:wss,navigation_accesskey%>"
            
                                         
            UseSimpleRendering="true"
            
                                         
            UseSeparateCss="false"
            
                                         
            Orientation="Horizontal"
            
                                         
            StaticDisplayLevels="2"
            
                                         
            MaximumDynamicDisplayLevels="4"
            
                                         
            SkipLinkText=""
            
                                         
            CssClass="s4-tn"/>
            
                                
            <SharePoint:DelegateControl runat="server" ControlId="TopNavigationDataSource1">
            
                                         
            <Template_Controls>
            
                                                  
            <asp:SiteMapDataSource
            
                                                           
            ShowStartingNode="True"
            
                                                           
            SiteMapProvider="CustomTopNavProvider"
            
                                                           
            id="topSiteMap"
            
                                                           
            runat="server" 
            />
            
                                         
            </Template_Controls>
            
                                
            </SharePoint:DelegateControl>
            
                        
            </asp:ContentPlaceHolder>
            </asp:ContentPlaceHolder> 

5. Note that the provider has changed to the customTopNavProvider, configuring the ASPMenu control also allows you to have more control over the Navigation.

6. Save the file and add the following to the Elements.xml of the feature so that the master page is referenced:

            
               <Module Name="Masterpage and Page Layouts" List="116" Url="_catalogs/masterpage" >
    <File Type="GhostableInLibrary" 
Path="Assets\Masterpages\citricCommonNav.master" 
Url="citricCommonNav.master" />
</Module>

7. Add feature event receiver, on feature activated there is an addition to the Web Config that will reference the site map provider, when deactivated this is then removed.

            public override void FeatureActivated(SPFeatureReceiverProperties properties)
            {   
                SPWebApplication webApp = (SPWebApplication)properties.Feature.Parent;
                webConfigMod(true, webApp);
            }
            public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
            {
                SPWebApplication webApp = (SPWebApplication)properties.Feature.Parent;
                webConfigMod(false, webApp);
            }
            private void webConfigMod(bool addOrRemove, SPWebApplication webApp)
            {
                SPWebConfigModification modifyWebConfig = new SPWebConfigModification();
                modifyWebConfig.Path = "configuration/system.web/siteMap/providers";
                modifyWebConfig.Name = "add[@name=\"CustomTopNavProvider\"]";
                modifyWebConfig.Sequence = 0;
                modifyWebConfig.Owner = "add[@name=\"CustomTopNavProvider\"]";
                modifyWebConfig.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
                modifyWebConfig.Value = "<add name=\"CustomTopNavProvider\" 
             siteMapFile=\"/_layouts/1033/Citric/SiteMapProvider/CustomTopNavMenu.sitemap\" 
             type=\"System.Web.XmlSiteMapProvider,System.Web, 
             Version=2.0.0.0, Culture=neutral, 
             PublicKeyToken=b03f5f7f11d50a3a\"/>";

     if (addOrRemove)

                {
                    webApp.WebConfigModifications.Add(modifyWebConfig);
                }
                else
                {
                    for (int c = webApp.WebConfigModifications.Count - 1; c >= 0; c--)
                    {
                        if (webApp.WebConfigModifications[c].Owner == "add[@name=\"CustomTopNavProvider\"]")
                        {
                            webApp.WebConfigModifications.Remove(webApp.WebConfigModifications[c]);
                        }
                    }
                }
                webApp.Update();
                webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();
            }

8. Add a SharePoint mapped Layouts folder and create the structure as followed.

TEMPLATE  -> LAYOUTS -> 1033 -> CITRIC -> SiteMapProvider

9. Add a new sitemap document to the SiteMapProvider folder.

10. The base document should look something like this:

            
               <?xml version="1.0" encoding="utf-8" ?>
            
               <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
            
                 <siteMapNode url="/" title="Citric" description="">
            
                   <siteMapNode url="/Home" title="Home" description="" />
            
                   <siteMapNode url="/Services" title="Services" description="" >
            
                     <siteMapNode url="/Consultancy" title="Consultancy" description="" />
            
                     <siteMapNode url="/Development" title="Development" description="" />
            
                     <siteMapNode url="/Hosting" title="Hosting" description="" />
            
                     <siteMapNode url="/Support" title="Support" description="" >
            
                       <siteMapNode url="/SubSupport" title="SubSupport" description="" />
            
                     </siteMapNode>
            
                   </siteMapNode>
            
                   <siteMapNode url="/Solutions" title="Solutions" description="" />
            
                   <siteMapNode url="/Case Studies" title="Case Studies" description="" />
            
                   <siteMapNode url="/Citric Blog" title="Citric Blog" description="" />
            
                   <siteMapNode url="/Clients" title="Clients" description="" />
            
                   <siteMapNode url="/About" title="My Business" description="">
            
                   </siteMapNode>
            
                   <siteMapNode url="/search" title="Search" description="" />
            
                 </siteMapNode>
            
               </siteMap>

11. Once all packaged up as a solution, all that is required is to select the common masterpage (edited and deployed above) and your common navigation feature activated.


 About us

Fuse Collaboration Services is a Cloud Solution Provider and Microsoft Gold Partner specialising in delivering SharePoint, Skype for Business, and Azure cloud-based solutions. Based in Northampton, UK.

Microsoft Gold Partner Logo showing 5 competencies

Read more

 Latest Tweets

 Latest Blog

 

 

New GDPR Analysis Pricing699<p class="lead">​​​Fuse can ease the challenge you are facing with the GDPR by offering a solution that will analyse your data for you quickly and cost effectively.</p><div></div><p>​My <a href="/_layouts/15/FIXUPREDIRECT.ASPX?WebId=4fc45909-2b6d-48b9-bcf9-a446e9d472d6&amp;TermSetId=c98895cd-d37f-4406-9cff-5480b4f829b6&amp;TermId=2b6bb279-9fd6-44bf-b4e7-23100b1f156a">recent blogs​</a> have already mentioned the effect that GDPR is having on UK businesses. The deadline is looming but <strong>don’t panic</strong> if you feel you are running out of time as we have <strong>important news</strong>. </p><p>Our customers are reporting that they are having many calls in response to the GDPR, offering you solutions to help but what you really need is a quick, fixed price solution that you know will do what it claims to. One of our partners has responded to customer and partner feedback by changing their pricing model for their data evaluation kit to be just that. </p><p>This is in response to listening to customers who have allocated budgets for the GDPR project, and it’s amazing to see that most budgets are being spent on the staff time spent on the project and not on solutions that would be more cost effective. Discovering PII (Personal Identifiable Information) is viewed as a <strong>manual process </strong>which costs organisations time and money. </p><p>Discovering personal Identifiable Information and Sensitive Information within documents is one of the first steps you need to complete to become compliant. </p><p>All you need is the answer to one question&#58;</p><p> <strong>Do you know the amount of data your business holds as electronic documents?</strong> Hopefully you do! If not, don’t worry we can help you find out with a <strong>free evaluation </strong>of your data.</p><div>If so, look at the table below for the cost of the solution we can introduce you to. The price includes an annual subscription with unlimited document scans for the 12-month license term, regardless of the size of documents.</div><div></div><ul><li>Up to 1TB = £2,999</li><li>Up to 5TB = £7,999</li><li>Up to 20TB = £14,999</li><li>20TB plus = price on application </li></ul><div>The pricing is based on the size of data in the system where the documents are stored. This pricing includes unlimited users and full product support. This solution can be used across multiple systems which include <strong> <em>Office 365</em></strong>, <strong> <em>Dropbox</em></strong>, <strong> <em>OneDrive</em></strong>, <strong> <em>Google Drive</em></strong> and <strong> <em>SharePoint</em></strong>. The solution then reads Office documents, PDF’s, OCR photocopies etc. It will also reduce the size of your files, removing duplicates and archiving&#160;<span style="text-align&#58;left;color&#58;#302e2f;text-transform&#58;none;text-indent&#58;0px;letter-spacing&#58;normal;font-family&#58;&quot;segoe ui&quot;,tahoma,helvetica,arial,verdana,sans-serif;font-size&#58;14px;font-style&#58;normal;font-variant&#58;normal;font-weight&#58;400;text-decoration&#58;none;word-spacing&#58;0px;display&#58;inline;white-space&#58;normal;orphans&#58;2;float&#58;none;background-color&#58;transparent;">files</span> non-accessed over a period. This solution is also valuable when <strong>migrating </strong>documents from SharePoint and file shares to O365.</div><div>&#160;</div><div class="thumbnail"> <img class="img-responsive" alt="ScanR Process" src="/ourblog/Blog%20Site%20Images/ScanRProcess.png" />&#160;</div><div></div><div class="well well-lg"><h2>Features of the ScanR Solution&#58;</h2><ul class="lead"><li>​Automate the process for discovering PII and Sensitive Information.</li><li>Enable you to quickly respond to “Subject Access Requests “and the “Right to be Forgotten “regulation.</li><li>Comply with over 10 of the required articles within GDPR.</li><li>Reduce data storage requirements, remove duplicates and archive non-accessed files. </li><li>Gain an understanding of who has access to it.</li><li>Gain an understanding of how long it’s being retained.</li><li>Retain personal data for a period of time directly related to the original intended purpose.</li><li>Find risky files and take action.</li><li>Manage a Subject Access Request&#58;</li><ul><li>Request a port of the data</li><li>Request a correction to the data</li><li>Request deletion of the data​</li></ul></ul></div><p></p><div class="thumbnail"> <img class="img-responsive" alt="ScanR overview" src="/ourblog/Blog%20Site%20Images/dashboard-scanr1.png" /> <div class="caption"><h3>The Overview Dashboard</h3><p>Rich dashboards in ScanR allow you to understand where your sensitive data resides, and prioritise where to take action.​</p></div></div><p>To read my previous blogs surrounding GDPR please click on the links below&#58; </p><p><a href="/_layouts/15/FIXUPREDIRECT.ASPX?WebId=4fc45909-2b6d-48b9-bcf9-a446e9d472d6&amp;TermSetId=c98895cd-d37f-4406-9cff-5480b4f829b6&amp;TermId=2b6bb279-9fd6-44bf-b4e7-23100b1f156a"><img class="ms-asset-icon ms-rtePosition-4" src="/_layouts/images/icgen.gif" alt="" />How to use SaaS solutions to identify sensitive data</a></p><p>​<a href="/_layouts/15/FIXUPREDIRECT.ASPX?WebId=4fc45909-2b6d-48b9-bcf9-a446e9d472d6&amp;TermSetId=c98895cd-d37f-4406-9cff-5480b4f829b6&amp;TermId=38ff9d3b-d9e1-4a22-b57e-04260d2d12b3"><img class="ms-asset-icon ms-rtePosition-4" src="/_layouts/images/icgen.gif" alt="" />Clear out the ROT!​</a></p><div class="well well-lg"> <p class="lead">To <strong>request a demo and free evaluation</strong> on your documents call Fuse today on 01604 797979 or <a href="/_layouts/15/FIXUPREDIRECT.ASPX?WebId=4fc45909-2b6d-48b9-bcf9-a446e9d472d6&amp;TermSetId=c98895cd-d37f-4406-9cff-5480b4f829b6&amp;TermId=218eb0be-10f6-490a-82a7-a7fd47c8de90">contact us</a>. We are available to answer any queries you have and our aim is to work alongside your needs and priorities ensuring optimum efficiency of your IT infrastructure.</p></div>l.ozier@fusecollaboration.com | Louise Ozier | 693A30232E777C6675736563735C6C2E6F7A696572 i:0#.w|fusecs\l.ozier22/11/2017 00:00:002017-11-22T00:00:00ZDiscover Personal Identifiable Information & Sensitive information within Documents24/11/2017 00:16:0696htmlFalseaspx

 Contact us

Our address
12-14 Brookfield, Duncan Close
Moulton Park, Northampton
NN3 6WL
P: +44(0)1604 797979
Contact Us