自定义导航控件和提供程序

上次修改时间: 2010年4月4日

适用范围: SharePoint Server 2010

若要自定义导航,您应使用 ASP.NET 网站导航,因为它提供了一个标准的、一致的且易于管理的解决方案。有关详细信息,请参阅 MSDN 上的 Microsoft ASP.NET 开发人员中心

自定义 Web 显示控件(菜单、TreeView 和 SiteMapPath)

可使用级联样式表 (CSS) 来自定义标准显示控件的外观。也可以编写您自己的 ASP.NET 控件,并将其用于 导航。有关详细信息,请参阅 System.Web.UI.WebControls.Menu 类文档。

备注

SharePoint Server 2010 还提供了可自定义的默认导航组件,例如,内容查询 Web 部件 (CQWP) 和目录 Web 部件。可以配置这两个控件以呈现链接的自定义选项。

System.Web.UI.WebControls.TreeViewSystem.Web.UI.WebControls.Menu 导航控件将绑定到 ASP.NET 数据源,从而在 Web 导航控件和基础导航提供程序之间提供一个抽象层。

实现站点地图提供程序

若要实现自己的站点地图提供程序,可以从任何默认站点地图提供程序派生一个自定义提供程序类。SharePoint Server 2010 包含了多个默认提供程序。也可以从 System.Web 命名空间中的 SiteMapProvider 类派生一个自定义提供程序类。不过,派生 SharePoint Server 2010 站点地图提供程序会提供其他一些好处,例如导航节点缓存和安全修整。因此,您应使用 SharePoint Server 2010 缓存和安全修整基础结构,而不是通过从默认提供程序派生来在自定义提供程序中编写自己的缓存和安全修整。

虽然站点地图提供程序类大约具有二十个抽象方法或虚拟方法,但在自定义站点地图提供程序中只须重写和实现其中的少数。

以下代码示例派生自 PortalSiteMapProvider 类并演示如何将项添加到站点地图提供程序。

public class CustomNavProviderWithList : PortalSiteMapProvider
    {
        public override SiteMapNodeCollection GetChildNodes(System.Web.SiteMapNode node)
        {
            PortalSiteMapNode portalNode = node as PortalSiteMapNode;
            if (portalNode != null)
            {
                if (portalNode.Type == NodeTypes.Area)
                {
                 
                    SiteMapNodeCollection nodeColl = base.GetChildNodes(portalNode);
                    using (SPSite currentSite = new SPSite(portalNode.Url))
                     {
                       SPWeb currentWeb = currentSite.OpenWeb();
                       SPListCollection lists = currentWeb.Lists;
                       foreach (SPList list in lists)
                       {
                           string listUrl = list.DefaultViewUrl;
                           PortalSiteMapNode childNode = new PortalSiteMapNode(webNode, listUrl, NodeTypes.custom, list.Title, listUrl, null);
                           nodeColl.Add(childNode);
                    }
                  }
                  return nodeColl;
                }
                else
                {
                    return base.GetChildNodes(portalNode);
                }
            }
            else
            {
                return new SiteMapNodeCollection();
            }
        }
    }
Public Class CustomNavProviderWithList
    Inherits PortalSiteMapProvider
        Public Overrides Function GetChildNodes(ByVal node As System.Web.SiteMapNode) As SiteMapNodeCollection
            Dim portalNode As PortalSiteMapNode = TryCast(node, PortalSiteMapNode)
            If portalNode IsNot Nothing Then
                If portalNode.Type = NodeTypes.Area Then

                    Dim nodeColl As SiteMapNodeCollection = MyBase.GetChildNodes(portalNode)
                    Using currentSite As New SPSite(portalNode.Url)
                       Dim currentWeb As SPWeb = currentSite.OpenWeb()
                       Dim lists As SPListCollection = currentWeb.Lists
                       For Each list As SPList In lists
                           Dim listUrl As String = list.DefaultViewUrl
                           Dim childNode As New PortalSiteMapNode(webNode, listUrl, NodeTypes.custom, list.Title, listUrl, Nothing)
                           nodeColl.Add(childNode)
                       Next list
                    End Using
                  Return nodeColl
                Else
                    Return MyBase.GetChildNodes(portalNode)
                End If
            Else
                Return New SiteMapNodeCollection()
            End If
        End Function
End Class

请参阅

引用

Microsoft.SharePoint.Publishing.Navigation

Microsoft.SharePoint.Navigation

概念

如何:自定义导航

处理菜单和导航对象