向顶部链接栏中添加链接
上次修改时间: 2010年11月1日
适用范围: SharePoint Foundation 2010
在 Microsoft SharePoint Foundation 网站上,顶部链接栏是仅显示在网站的标题和说明之下的选项卡式条带。SharePoint Foundation 对象模型将顶部链接栏的导航结构表示为 SPNavigationNode 对象的集合。您可以通过向顶部链接栏的集合中添加 SPNavigationNode 对象来添加链接。
如何添加链接
网站的顶部链接栏由 SPNavigationNodeCollection 类的实例表示。获取该集合的方法是访问网站的 SPWeb.Navigation 属性以返回 SPNavigation 对象,然后访问该对象的 TopNavigationBar 属性。
SPNavigationNodeCollection topnav = web.Navigation.TopNavigationBar;
Dim topnav As SPNavigationNodeCollection = web.Navigation.TopNavigationBar
警告 |
---|
如果网站配置为使用来自其父网站的顶部链接栏,则其 SPWeb.Navigation.TopNavigationBar 属性返回 null。 |
在获取集合后,您可以构造 SPNavigationNode 对象来表示新链接,然后调用 SPNavigationNodeCollection 类的方法将节点添加到顶部链接栏中。
将链接添加到顶部链接栏中
检查 SPWeb.Navigation.UseShared 属性的值,以确保网站具有自己的顶部链接栏,并且没有从父网站继承链接。
如果 UseShared 返回 false,则网站具有自己的顶部链接栏,您可以向其中添加链接。如果该属性返回 true,则网站使用其父网站的顶部链接栏。在这种情况下,您可以将链接添加到父网站的顶部链接栏中,也可以选择将链接放到子网站的"快速启动"菜单上。
检查重复链接。
一种检查方法是调用 SPWeb.Navigation.GetNodeByUrl 方法,将建议的链接的 URL 作为参数传递。如果未找到具有该 URL 的链接,GetNodeByUrl 方法将返回 null。
如果找到了链接,该方法将返回 SPNavigationNode 对象。不过,现有链接可能位于"快速启动"菜单上而不在顶部链接栏上。若要验证现有链接是否属于顶部链接栏,请检查返回的节点的 ParentId 属性。顶部链接栏的 Id 始终为 1002。
如果顶部链接栏尚不包含该链接,请使用 SPNavigationNode 类的构造函数之一来为它创建导航节点。
该类具有两个构造函数:
第一个构造函数接受两个参数:包含链接的显示文本的字符串以及包含链接应解析的 URL 的另一个字符串。仅对内部链接(指向相同网站集中的内容的链接)使用此构造函数。URL 应相对于服务器。
第二个构造函数接受三个参数。前两个参数与另一个构造函数的相同。第三个参数是指示链接是外部链接还是内部链接的 boolean 值。可为指向外部网站的链接传递 true,并在第二个参数中传递绝对 URL。如果链接是内部链接,请传递 false 和相对于服务器的 URL。
通过获取 SPWeb.Navigation.TopNavigationBar 属性的值来获取对表示顶部链接栏的 SPNavigationNodeCollection 对象的引用。
调用 SPNavigationNodeCollection 类的方法来将节点添加到集合中。
若要使节点成为栏中的第一个节点,请调用 AddAsFirst 方法。若要使它成为最后一个节点,请调用 AddAsLast 方法。若要将它插入另一个节点之后,请调用 Add 方法。
备注
仅在将 SPNavigationNode 对象添加到集合中后它才会完全初始化。如果该对象还不是集合的成员,只读属性(例如 Id 和 ParentId)将返回 null。
示例
以下示例中的控制台应用程序循环访问网站集中的网站的集合,将指向每个网站的链接添加到集合的根网站的顶部链接栏中。在添加链接之前,应用程序会检查现有链接。
using System;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Navigation;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (SPSite site = new SPSite("https://localhost"))
using (SPWeb web = site.OpenWeb())
{
if (web.Navigation.UseShared)
return;
// Get the top link bar.
SPNavigationNodeCollection topnav = web.Navigation.TopNavigationBar;
// Iterate over the collection of subsites.
foreach (SPWeb subweb in web.Webs)
{
// Check for an existing link.
SPNavigationNode node = web.Navigation.GetNodeByUrl(subweb.ServerRelativeUrl);
if (node == null || node.ParentId != 1002)
{
// No link, so add one.
// Truncate a long title.
string linkTitle = subweb.Title;
if (linkTitle.Length > 15)
linkTitle = linkTitle.Substring(0, 12) + "...";
// Create the link.
node = new SPNavigationNode(linkTitle, subweb.ServerRelativeUrl);
// Add it to the top link bar.
node = topnav.AddAsLast(node);
}
subweb.Dispose();
}
}
Console.Write("\nPress ENTER to continue....");
Console.ReadLine();
}
}
}
Imports System
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Navigation
Module ConsoleApp
Sub Main()
Using site As New SPSite("https://localhost")
Using web As SPWeb = site.OpenWeb()
If web.Navigation.UseShared Then
Return
End If
' Get the top link bar.
Dim topnav As SPNavigationNodeCollection = web.Navigation.TopNavigationBar
' Iterate over the collection of subsites.
For Each subweb As SPWeb In web.Webs
' Check for an existing link.
Dim node As SPNavigationNode = web.Navigation.GetNodeByUrl(subweb.ServerRelativeUrl)
If node Is Nothing OrElse node.ParentId <> 1002 Then
' No link, so add one.
' Truncate a long title.
Dim linkTitle As String = subweb.Title
If linkTitle.Length > 15 Then
linkTitle = linkTitle.Substring(0, 12) + "..."
End If
' Create the link.
node = New SPNavigationNode(linkTitle, subweb.ServerRelativeUrl)
' Add it to the top link bar.
node = topnav.AddAsLast(node)
End If
subweb.Dispose()
Next
End Using
End Using
Console.Write(vbCrLf & "Press ENTER to continue....")
Console.Read()
End Sub
End Module