使用自定义数据源进行导航

上次修改时间: 2010年11月1日

适用范围: SharePoint Foundation 2010

Microsoft SharePoint Foundation 网站的部件版式包括若干个绑定到数据源控件的导航控件。在每种情况下,数据源控件的功能是从导航提供程序中检索站点地图节点或其他导航数据,然后将这些数据传递给导航控件进行显示。

您可以用自己设计的控件替换内置导航控件之后的一些数据源控件。此类型的自定义不需要您更改母版页或部署自定义内容页。这种替换机制完全由 SharePoint Foundation 功能中声明的指令来驱动。有关创建和部署功能的信息,请参阅使用功能

可以自定义的数据源

在随 SharePoint Foundation 安装的母版页中,将三个重要导航控件之后的数据源控件声明为委托控件,以使数据源可进行委托替换。您可以为下面的每个导航控件替换自定义数据源:

  • 顶部链接栏

  • 快速启动

  • 树视图

若要替换上述任意控件的默认数据源,您必须创建一个功能并在场解决方案中部署该功能。替换控件可以是 SharePoint Foundation 或 Microsoft .NET Framework 提供的数据源控件之一,也可以是您自己设计的自定义数据源控件。如果您编写自己的数据源控件,则必须由声明委托替换的功能或其他一些进程将编译的程序集安装到全局程序集缓存中。自定义控件还必须在 web.config 文件中具有一个 SafeControl 项。有关详细信息,请参阅如何:自定义 Delegate 控件

控件替换的工作原理

与占位符控件相似,委托控件定义母版页中可以替换为其他内容的区域。在此示例中,数据源控件是可在运行时被替换控件替换的默认内容。

例如,摘自 v4.master 的以下内容为顶部链接栏声明一个 AspMenu 控件并声明一个 DelegateControl 作为该菜单的数据源。该委托的默认内容是一个 SiteMapDataSource 控件。

<SharePoint:AspMenu
    ID="TopNavigationMenuV4"
    Runat="server"
    EnableViewState="false"
    DataSourceID="topSiteMap"
    AccessKey="1"
    UseSimpleRendering="true"
    UseSeparateCss="false"
    Orientation="Horizontal"
    StaticDisplayLevels="2"
    MaximumDynamicDisplayLevels="1"
    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>

与占位符控件相同,委托控件的默认内容可以替换为自定义内容,在此示例中替换为另一个控件。不同的是,使用委托控件时不必像使用占位符那样,通过向内容页中添加标记来替代默认内容,而是通过部署包括功能的场解决方案来进行替换,该功能可标识要替换的控件和要用于替换它的控件。

如何:自定义 Delegate 控件中详细介绍了为委托替换实现功能的过程。简而言之,向功能中添加元素清单,并在该清单中声明一个 Control 元素,该元素可以标识委托控件,还可以标识替换候选项的程序集和类。

例如,下面的 XML 用名为 Contoso.NavigationDataSource 的自定义数据源控件替换顶部链接栏的数据源。

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="https://schemas.microsoft.com/sharepoint/">
  <Control Id="TopNavigationDataSource"Sequence="50"
    ControlClass="Contoso.NavigationDataSource"
    ControlAssembly="Contoso, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <Property Name="SiteMapProvider">SPNavigationProvider</Property>
    <Property Name="ID">topSiteMap</Property>
  </Control>
</Elements>

委托控件中 ControlId 属性的值为 TopNavigationDataSource。因此,Control 元素的 Id 属性的值必须也为 TopNavigationDataSource。这样会通过目标委托链接自定义控件。

Control 元素的 ControlClass 属性和 ControlAssembly 属性会告知 SharePoint Foundation 查找候选控件的位置。包含控件代码的签名程序集必须安装在全局程序集缓存中。

该示例标记的关键部分是 Property 元素,该元素将候选控件的 ID 属性设置为 topSiteMap。此值与 AspMenu 控件用于其 DataSourceID 属性的值相同。运行时,菜单控件会绑定到具有该 ID 的数据源控件。计划是为其查找自定义控件代替默认控件。当然,自定义控件必须派生自 HierarchicalDataSourceControl 类,因为这是 AspMenu 控件在数据源中预期的。

在某种情况下,可能有若干个功能以同一委托控件为目标。为了解决冲突,每个功能必须为其替换候选项指定一个序列号,从而在候选项之间建立优先级。运行时,委托控件接受在服务器场、Web 应用程序、网站集和网站级别声明的控件元素联合。序列号最低的控件会被添加到控件树中。如果序列不分前后,则控件的顺序是任意的。

在 Contoso.NavigationDataSource 控件的示例标记中,Sequence 属性的值为 50。尽管默认数据源控件的序列号不通过其标记来指示,但假定它大于 100 会比较安全。如果 Contoso 控件是唯一的替换候选项,它将替换默认数据源。

请参阅

任务

如何:自定义 Delegate 控件

如何:自定义快速启动显示

概念

导航控件

委派控件(控件模板化)

如何:共享网站之间的顶部链接栏