65.9K
CodeProject 正在变化。 阅读更多。
Home

SharePoint 自定义站点导航

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2008年5月13日

BSD

2分钟阅读

viewsIcon

134528

downloadIcon

464

本文概述了如何在 MOSS 发布网站上进行自定义站点导航。

screen.png

引言

本文概述了如何在 MOSS 发布网站上进行自定义站点导航。 如果您想知道是否可以使用“站点设置”页面进行配置,请继续阅读。

背景

SharePoint 2007 附带 Web 内容管理功能及其自定义的 SiteMapProvider。开箱即用,在发布站点下创建的任何站点和子站点的 URL 都会固定在顶部导航菜单中。 虽然这在典型的 WCM 环境中是理想的,并且当然可以从内置的“站点设置”功能进行配置,但在非 WCM 环境中使用时,可能会出现问题。

假设您想要一个与您的站点拓扑无关的固定顶部导航菜单,那么开箱即用的提供程序将无法使用。

您可能会问我为什么首先要使用发布站点。 好吧,大多数 SharePoint 自定义站点定义都要求您使用基于发布站点的定义。 为了获得用户可交换的母版页和备用 CSS 文件,您必须从发布站点开始。

默认情况下,以下部分存在于发布站点的 web.config 文件中。 如您所见,CurrentNavSiteMapProvider 定义了在发布站点中使用的提供程序。

<siteMap defaultProvider="CurrentNavSiteMapProvider" enabled="true">
      <providers>
        <add name="SPNavigationProvider" type="Microsoft.SharePoint.Navigation.SPNavigationProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="SPSiteMapProvider" type="Microsoft.SharePoint.Navigation.SPSiteMapProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="SPContentMapProvider" type="Microsoft.SharePoint.Navigation.SPContentMapProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="SPXmlContentMapProvider" siteMapFile="_app_bin/layouts.sitemap" type="Microsoft.SharePoint.Navigation.SPXmlContentMapProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="AdministrationQuickLaunchProvider" description="QuickLaunch navigation provider for the central administration site" type="Microsoft.Office.Server.Web.AdministrationQuickLaunchProvider, Microsoft.Office.Server.UI, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="SharedServicesQuickLaunchProvider" description="QuickLaunch navigation provider for shared services administration sites" type="Microsoft.Office.Server.Web.SharedServicesQuickLaunchProvider, Microsoft.Office.Server.UI, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="GlobalNavSiteMapProvider" description="CMS provider for Global navigation" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" NavigationType="Global" EncodeOutput="true" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />
        <add name="CombinedNavSiteMapProvider" description="CMS provider for Combined navigation" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" NavigationType="Combined" EncodeOutput="true" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />
        <add name="CurrentNavSiteMapProvider" description="CMS provider for Current navigation" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral,PublicKeyToken=71e9bce111e9429c" NavigationType="Current" EncodeOutput="true" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />
        <add name="CurrentNavSiteMapProviderNoEncode" description="CMS provider for Current navigation, no encoding of output" type="Microsoft.SharePoint.Publishing.Navigation.PortalSiteMapProvider, Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" NavigationType="Current" EncodeOutput="false" IncludePages="PerWeb" IncludeHeadings="true" IncludeAuthoredLinks="true" />
        <add name="SiteDirectoryCategoryProvider" description="Site Directory category provider" type="Microsoft.SharePoint.Portal.WebControls.SiteDirectoryCategoryProvider, Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="MySiteMapProvider" description="MySite provider that returns areas and based on the current user context" type="Microsoft.SharePoint.Portal.MySiteMapProvider, Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="MySiteLeftNavProvider" description="MySite Left Nav provider that returns areas and based on the current user context" type="Microsoft.SharePoint.Portal.MySiteLeftNavProvider,  Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="UsagePagesSiteMapProvider" description="Provider for navigation in Portal Usage pages" type="Microsoft.SharePoint.Portal.Analytics.UsagePagesSiteMapProvider, Microsoft.SharePoint.Portal, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
        <add name="SPXmlAdminContentMapProvider" siteMapFile="_app_bin/admin.sitemap" type="Microsoft.SharePoint.Navigation.SPXmlContentMapProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
      </providers>
 </siteMap>

 

相应地,实际输出导航控件的控件放置在母版页中,如下所示。 这是自定义控件,它提供在 SharePoint 站点设置页面中显示/隐藏子站点的能力。

<publishingnavigation:portalsitemapdatasource id="SiteMapDataSourceRoot" runat="server" 
   sitemapprovider="CombinedNavSiteMapProvider" enableviewstate="true" 
   startfromcurrentnode="true" startingnodeoffset="0" showstartingnode="true">
</publishingnavigation:portalsitemapdatasource>

要覆盖此行为,您需要做几件事。

  1. 创建一个新的母版页,该母版页基于 BlackBand.master(或 PublishingLayouts 功能下目录中的任何母版页)。
  2. PublishingNavigation 控件声明替换为菜单控件。
  3. 为母版页创建代码隐藏文件以加载自定义导航。
  4. 将代码隐藏信息添加到母版页指令并将新母版页以及程序集部署到 SharePoint。
 Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
            MyBase.OnLoad(e)
            Dim menu As Menu = DirectCast(FindControl("Menu1"), Menu)

            Dim doc As XDocument = XDocument.Load(
                "C:\Inetpub\wwwroot\wss\VirtualDirectories\80\web.sitemap")
            Dim query = From c In doc.Element("menuitems").Elements("menuitem")

            Dim parentItem As MenuItem
            For Each element As XElement In query
                parentItem = New MenuItem()

                Dim subQuery = From c In element.Elements("menuitem")
                For Each node As XElement In subQuery
                    Dim item As New MenuItem()
                    With item
                        .Text = node.Attribute("text")
                        .NavigateUrl = node.Attribute("navigateurl")
                        .ToolTip = node.Attribute("tooltip")
                        .ImageUrl = "tool.png"
                    End With
                    parentItem.ChildItems.Add(item)

                Next

                With parentItem
                    .Text = element.Attribute("text")
                    .NavigateUrl = element.Attribute("navigateurl")
                    .ToolTip = element.Attribute("tooltip")
                    .ImageUrl = "heart.png"
                End With
                menu.Items.Add(parentItem)
            Next
 End Sub

本质上,代码隐藏将加载一个名为 web.sitemap 的 XML 文件(它可以是您喜欢的任何 XML 文件),并迭代地将导航节点添加到菜单。 这样,您甚至可以根据需要将个性化节点添加到导航中。

关注点

为什么要使用发布站点?

好吧,大多数 SharePoint 自定义站点定义都要求您使用基于发布站点的定义。 为了获得用户可交换的母版页和备用 CSS 文件,您必须从发布站点开始。

为什么不是 XmlSiteMapProvider

如果您使用该提供程序(开箱即用自 ASP.NET 2.0),您将无法修改导航中的节点。 此对象的 Items 属性将具有零个要修改的项目。

为什么使用 LINQ to XML?

当然,不需要使用 LINQ to XML。 它仅仅简化了难以理解的嵌套循环或通常伴随 XML 文档处理的 XPath。

历史

[2008 年 5 月 14 日] 添加了一个简短的 FAQ 部分。

© . All rights reserved.