Share via


Cómo agregar un subsitio a la barra de vínculos superior o al menú Inicio rápido

Última modificación: lunes, 01 de noviembre de 2010

Hace referencia a: SharePoint Foundation 2010

Cuando crea un subsitio a través de la interfaz de usuario de Microsoft SharePoint Foundation, puede especificar si los vínculos al sitio nuevo aparecerán en el área Inicio rápido y en la barra de vínculos superior del sitio primario. También puede agregar vínculos en ambos lugares escribiendo el código que manipula la propiedad SPWeb.Navigation.TopNavigationBar del sitio web primario y su propiedad SPWeb.Navigation.QuickLaunch.

Inserción de un vínculo en la barra de vínculos superior

En el modelo de objetos de SharePoint Foundation, la estructura de navegación para la barra de vínculos superior se representa con una instancia de la clase SPNavigationNodeCollection. Para obtener la colección, primero obtenga acceso a la propiedad SPWeb.Navigation del sitio web, que devuelve un objeto SPNavigation y, a continuación, obtenga acceso a la propiedad TopNavigationBar de ese objeto.

Nota de precauciónPrecaución

Si un sitio web está configurado para usar la barra de vínculos superior del sitio primario, la propiedad TopNavigationBar devuelve null.

Si dispone de una colección de nodos de navegación, cree un objeto SPNavigationNode para representar el nuevo vínculo y, a continuación, llame a un método de la clase SPNavigationNodeCollection para agregar el nodo a la barra de vínculos superior.

Para agregar un vínculo a un subsitio en la barra de vínculos superior del sitio primario

  1. Obtenga una referencia al objeto SPWeb que representa el subsitio.

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. Compruebe que el subsitio es realmente un subsitio mediante la prueba de valor de la propiedad IsRootWeb. Compruebe también que el sitio primario no use una barra de vínculos superior compartida mediante la prueba de valor de su propiedad UseShared.

    if (!child.IsRootWeb && !child.ParentWeb.Navigation.UseShared)
    
    If Not child.IsRootWeb AndAlso Not child.ParentWeb.Navigation.UseShared Then
    
  3. Obtenga el objeto SPNavigationNodeCollection que representa la barra de vínculos superior del sitio primario.

    SPNavigationNodeCollection topnav = child.ParentWeb.Navigation.TopNavigationBar;
    
    Dim topnav As SPNavigationNodeCollection = child.ParentWeb.Navigation.TopNavigationBar
    
  4. Para comprobar si hay un vínculo existente al subsitio, consulte en la colección si hay un objeto SPNavigationNode que tenga una propiedad Url que tenga un valor igual a la propiedad SPWeb.ServerRelativeUrl del subsitio.

    SPNavigationNode node = topnav
        .Cast<SPNavigationNode>()
        .FirstOrDefault(n => n.Url.Equals(child.ServerRelativeUrl));
    
    Dim node As SPNavigationNode = topnav.Cast(Of SPNavigationNode)().FirstOrDefault( _
        Function(n) n.Url.Equals(child.ServerRelativeUrl))
    
  5. Si no existe ningún vínculo, cree un objeto SPNavigationNode para representar un vínculo y llame a un método de la clase SPNavigationNodeCollection para agregarlo a la barra de vínculos superior del sitio primario.

    if (node == null)
    {
        node = new SPNavigationNode(child.Title, child.ServerRelativeUrl);
        node = topnav.AddAsLast(node);
    }
    
    If node Is Nothing Then
    
        node = New SPNavigationNode(child.Title, child.ServerRelativeUrl)
        node = topnav.AddAsLast(node)
    
    End If
    

Ejemplo

En el siguiente ejemplo se muestra cómo agregar un vínculo a un subsitio en la estructura de navegación del sitio primario. El ejemplo forma parte de un proyecto más grande que usa una característica de ámbito web para agregar el vínculo. La característica incluye un controlador de eventos que implementa la clase SPFeatureReceiver y el código para crear el vínculo y agregarlo al sitio primario está en el método FeatureActivated del receptor de la característica.

Si el sitio donde se activa la característica tiene subsitios, el método busca un subsitio denominado "ourwiki". Si no existe el subsitio, el método obtiene una referencia a él. Si no hay ningún subsitio, o hay subsitios pero ninguno tiene el nombre "ourwiki", el método crea uno.

A continuación, el método agrega el vínculo de navegación para el subsitio. Si el sitio actual tiene su propia barra de vínculos superior (es decir, no usa la barra de su elemento primario), el vínculo se agrega a la barra de vínculos superior del sitio actual. De lo contrario, se agrega al menú Inicio rápido del sitio actual.

Inicio rápido y la barra de vínculos superior se representan con objetos SPNavigationNodeCollection. Por lo tanto, en este momento el código es el mismo independientemente de la colección que sea el destino para el vínculo de navegación. En el ejemplo se comprueba primero si ya hay un vínculo al subsitio en la colección de nodos de navegación. Si no es así, el código crea un vínculo y lo agrega.

Nota

El código de ejemplo usa varios tipos sin calificación. Para compilar correctamente el código, la clase de receptor de la característica debe importar los siguientes espacios de nombres:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{

    // Get the website where the feature is activated.
    SPWeb parentWeb = properties.Feature.Parent as SPWeb;
    if (parentWeb == null)
        return;

    SPWeb childWeb = null;
    string childName = "ourwiki";

    // If a subsite by that name exists, open it.
    string[] webs = parentWeb.Webs.Names;
    if (webs != null && Array.IndexOf(webs, childName) >= 0)
    {
        childWeb = parentWeb.Webs[childName];
    }

    // Otherwise, create the subsite.
    if (childWeb == null)
    {
        string title = "Wiki";
        string desc = "A place to capture knowledge.";
        uint lcid = parentWeb.Language;

        string templateName = "WIKI#0";

        childWeb = parentWeb.Webs.Add(childName, title, desc, lcid, templateName, false, false);
    }

    // Let the subsite use the parent site's top link bar.
    childWeb.Navigation.UseShared = true;

    // Get a collection of navigation nodes.
    SPNavigationNodeCollection nodes = null;
    if (parentWeb.Navigation.UseShared)
    {

        // Parent site does not have its own top link bar
        // so use the parent's Quick Launch.
        nodes = parentWeb.Navigation.QuickLaunch;
    }
    else
    {

        // Parent site has its own top link bar,
        // so use it.
        nodes = parentWeb.Navigation.TopNavigationBar;
    }

    // Check for an existing link to the subsite.
    SPNavigationNode node = nodes
        .Cast<SPNavigationNode>()
        .FirstOrDefault(n => n.Url.Equals(childWeb.ServerRelativeUrl));

    // No link, so add one.
    if (node == null)
    { 

        // Create the node.
        node = new SPNavigationNode(childWeb.Title, childWeb.ServerRelativeUrl);

        // Add it to the collection.
        node = nodes.AddAsLast(node);
    }

    childWeb.Dispose();
    parentWeb.Dispose();
}
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)

    'Get the website where the feature is activated.
    Dim parentWeb As SPWeb = TryCast(properties.Feature.Parent, SPWeb)
    If parentWeb Is Nothing Then
        Return
    End If

    Dim childWeb As SPWeb = Nothing
    Dim childName As String = "ourwiki"

    ' If a subsite by that name exists, open it.
    Dim webs As String() = parentWeb.Webs.Names
    If webs IsNot Nothing AndAlso Array.IndexOf(webs, childName) >= 0 Then
        childWeb = parentWeb.Webs(childName)
    End If

    ' Otherwise, create the subsite.
    If childWeb Is Nothing Then
        Dim title As String = "Wiki"
        Dim desc As String = "A place to capture knowledge."
        Dim lcid As UInteger = parentWeb.Language

        Dim templateName As String = "WIKI#0"

        childWeb = parentWeb.Webs.Add(childName, title, desc, lcid, _
                                        templateName, False, False)
    End If

    ' Let the subsite use the parent site's top link bar.
    childWeb.Navigation.UseShared = True

    ' Get a collection of navigation nodes.
    Dim nodes As SPNavigationNodeCollection = Nothing

    If parentWeb.Navigation.UseShared Then

        ' Parent site does not have its own top link bar
        ' so use the parent's Quick Launch.
        nodes = parentWeb.Navigation.QuickLaunch
    Else

        ' Parent site has its own top link bar,
        ' so use it.
        nodes = parentWeb.Navigation.TopNavigationBar
    End If

    ' Check for an existing link to the subsite.
    Dim node As SPNavigationNode = nodes.Cast(Of SPNavigationNode)().FirstOrDefault( _
        Function(n) n.Url.Equals(childWeb.ServerRelativeUrl))

    ' No link, so add one.
    If node Is Nothing Then

        ' Create the node.
        node = New SPNavigationNode(childWeb.Title, childWeb.ServerRelativeUrl)

        ' Add it to the collection.
        node = nodes.AddAsLast(node)
    End If

    childWeb.Dispose()
    parentWeb.Dispose()
End Sub

Inserción de un vínculo en el menú Inicio rápido

En el modelo de objetos de SharePoint Foundation, cada vínculo de navegación del menú Inicio rápido se representa con una instancia de la clase SPNavigationNode. El nivel superior de la estructura del menú Inicio rápido es una colección de objetos SPNavigationNode representados con una instancia de la clase SPNavigationNodeCollection. Los nodos en este primer nivel del menú son los encabezados: Lista, Bibliotecas, Sitios, etc. Cada encabezado tiene una propiedad SPNavigationNode.Children que devuelve una colección de nodos que representan los vínculos debajo del encabezado.

Para insertar un vínculo debajo del encabezado Sitios, puede llamar al método AddToQuickLaunch y especificar el encabezado Sitios. El método acepta dos argumentos: un objeto SPNavigationNode que representa el vínculo nuevo y un valor de enumeración SPQuickLaunchHeading que especifica el encabezado que debe recibir el vínculo.

SPNavigation nav = web.ParentWeb.Navigation;
SPNavigationNode node = new SPNavigationNode(web.Title, web.ServerRelativeUrl);
node = nav.AddToQuickLaunch(node, SPQuickLaunchHeading.Sites);
Dim nav As SPNavigation = web.ParentWeb.Navigation
Dim node As SPNavigationNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)
node = nav.AddToQuickLaunch(node, SPQuickLaunchHeading.Sites)

Por supuesto deseará asegurarse de que no exista un vínculo al subsitio debajo del encabezado Sitios. En el siguiente procedimiento se explica una forma de comprobarlo.

Para agregar un vínculo a un subsitio en Inicio rápido del sitio primario

  1. Obtenga una referencia al objeto SPWeb que representa el subsitio.

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. Compruebe que el subsitio sea en realidad un subsitio y no el sitio web raíz de la colección.

    if (!child.IsRootWeb)
    
    If Not child.IsRootWeb Then
    
  3. Obtenga el objeto SPNavigation para el sitio web primario.

    SPNavigation nav = web.ParentWeb.Navigation;
    
    Dim nav As SPNavigation = web.ParentWeb.Navigation
    
  4. Obtenga el encabezado Sitios en el menú Inicio rápido llamando al método GetNodeById y pasando el entero equivalente de SPQuickLaunchHeading.Sites.

    SPNavigationNode sitesHeading = nav.GetNodeById((int)SPQuickLaunchHeading.Sites);
    
    Dim sitesHeading As SPNavigationNode = nav.GetNodeById(CInt(SPQuickLaunchHeading.Sites))
    

    Nota

    Si el menú Inicio rápido no tiene aún un encabezado Sitios, la llamada a GetNodeById devuelve null.

  5. Para comprobar si hay un vínculo existente para el subsitio, consulte si los elementos secundarios del encabezado Sitios tienen un objeto SPNavigationNode que tenga una propiedad Url con un valor igual a la propiedad SPWeb.ServerRelativeUrl del subsitio.

    SPNavigationNode newNode = null;
    if (sitesHeading != null)
    {
        newNode = sitesHeading
            .Children
            .Cast<SPNavigationNode>()
            .FirstOrDefault(n => n.Url == web.ServerRelativeUrl);
    }
    
    Dim newNode As SPNavigationNode = Nothing
    If sitesHeading IsNot Nothing Then
        newNode = sitesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
            Function(n) n.Url = web.ServerRelativeUrl)
    End If
    
  6. Si no existe ningún vínculo, cree un objeto SPNavigationNode para representar el vínculo y llame al método AddToQuickLaunch para agregarlo al menú Inicio rápido del sitio primario debajo del encabezado Sitios.

    if (newNode == null)
    {
    
        // Create the link.
        newNode = new SPNavigationNode(web.Title, web.ServerRelativeUrl);
    
        // Add it to the parent site's Quick Launch.
        newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites);
    }
    
    If newNode Is Nothing Then
    
        ' Create the link.
        newNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)
    
        ' Add it to the parent site's Quick Launch.
        newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites)
    End If
    

Ejemplo

El siguiente ejemplo es una aplicación de consola que ilustra el procedimiento para insertar un vínculo en un subsitio en el menú Inicio rápido del sitio primario. Puede agregar un código similar (convenientemente modificado) en el método FeatureActivated de un receptor de la característica que cree un subsitio.

using System;
using System.Linq;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Navigation;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("https://localhost"))
            {

                // Get the subsite.
                using (SPWeb web = site.OpenWeb("parent/child"))
                {
                    if (!web.IsRootWeb)
                    { 

                        // Get the parent site's navigator.
                        SPNavigation nav = web.ParentWeb.Navigation;

                        // Get the Sites heading.
                        SPNavigationNode sitesHeading = nav.GetNodeById((int)SPQuickLaunchHeading.Sites);

                        // Check if a link to the child already exists.
                        SPNavigationNode newNode = null;
                        if (sitesHeading != null)
                        {
                            newNode = sitesHeading
                                .Children
                                .Cast<SPNavigationNode>()
                                .FirstOrDefault(n => n.Url == web.ServerRelativeUrl);
                        }

                        // No link, so create one.
                        if (newNode == null)
                        {

                            // Create the link.
                            newNode = new SPNavigationNode(web.Title, web.ServerRelativeUrl);

                            // Add it to the parent site's Quick Launch.
                            newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites);
                        }

                        Console.WriteLine("A link to {0} is on the Quick Launch for {1}", newNode.Title, nav.Web.Title);
                    }
                }
            }
            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("parent/child")

                If Not web.IsRootWeb Then

                    ' Get the parent site's navigator.
                    Dim nav As SPNavigation = web.ParentWeb.Navigation

                    ' Get the Sites heading.
                    Dim sitesHeading As SPNavigationNode = nav.GetNodeById(CInt(SPQuickLaunchHeading.Sites))

                    ' Check if a link to the child already exists.
                    Dim newNode As SPNavigationNode = Nothing
                    If sitesHeading IsNot Nothing Then

                        newNode = sitesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
                            Function(n) n.Url = web.ServerRelativeUrl)
                    End If

                    ' No link, so create one.
                    If newNode Is Nothing Then

                        ' Create the link.
                        newNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)

                        ' Add it to the parent site's Quick Launch.
                        newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites)
                    End If

                    Console.WriteLine("A link to {0} is on the Quick Launch for {1}", newNode.Title, nav.Web.Title)
                End If

            End Using

        End Using

        Console.Write(vbCrLf & "Press ENTER to continue....")
        Console.Read()
    End Sub

End Module

Vea también

Tareas

Procedimiento para personalizar la visualización de Inicio rápido

Procedimiento para mostrar u ocultar el Inicio rápido

Conceptos

Adición de vínculos a la barra de vínculos superior

Procedimiento para compartir la barra de vínculos superior entre sitios