Pergunta

Como podemos exibir a navegação do link superior de outro conjunto de sites em MySite?Agora temos uma página mestra personalizada com algum código personalizado, mas ela mostra apenas o menu atual do site.Queremos que ele mostre o menu de outro conjunto de sites específico.

É assim que criamos o menu adicional:

<%@ Register TagPrefix="PublishingNavigation" Namespace="Microsoft.SharePoint.Publishing.Navigation" Assembly="Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<publishingnavigation:portalsitemapdatasource id="globalmenuSiteMap" runat="server" enableviewstate="false"
                    sitemapprovider="GlobalNavSiteMapProvider" startfromcurrentnode="false" startingnodeoffset="0"
                    showstartingnode="true" trimnoncurrenttypes="Heading" />

<SharePoint:AspMenu ID="TopNavigationMenuV42" runat="server" EnableViewState="false" EncodeTitle="False"
                        DataSourceID="globalmenuSiteMap" AccessKey="<%$Resources:wss,navigation_accesskey%>"
                        UseSimpleRendering="true" UseSeparateCSS="false" Orientation="Horizontal" StaticDisplayLevels="2"
                        MaximumDynamicDisplayLevels="4" SkipLinkText="" CssClass="s4-tn" />
Foi útil?

Solução

A menos que você queira codificar os links ou usar algum fonte de dados personalizada Só conheço duas maneiras diferentes de fazer isso: a maneira ruim e a horrível.

A maneira horrível

Defina o SPWeb atual para o SPWeb desejado e então inicialize o menu, por exemplo em um Controle de usuário:

using (var site = new SPSite("http://localhost"))
{
  using (var web = site.OpenWeb())
  {
    var request = new HttpRequest("", web.Url, "");
    var sw = new StringWriter();
    var response = new HttpResponse(sw);
    var originalRequest = HttpContext.Current;
    HttpContext.Current = new HttpContext(request, response);
    SPControl.SetContextWeb(HttpContext.Current, web);
    var siteMapDataSource = new PortalSiteMapDataSource 
    {
      SiteMapProvider = "GlobalNavSiteMapProvider"
    };

    var menu = new AspMenu {DataSource = siteMapDataSource};
    menu.DataBind();
    Controls.Add(menu);
    HttpContext.Current = originalRequest;
    SPControl.SetContextWeb(HttpContext.Current, SPContext.Current.Web);
  }
}

O mau caminho

(e provavelmente não está funcionando corretamente)

Crie seu próprio provedor que busca a navegação diretamente do SPWeb:

public class CustomSiteMapProvider : PortalSiteMapProvider
{
  private const string SiteUrl = "http://localhost";

  private static IEnumerable<SPNavigationNode> GetNavigationNodes(string url)
  {
    using (var site = new SPSite(SiteUrl))
    {
      using (var web = site.OpenWeb(url))
      {
        return PublishingWeb.GetPublishingWeb(web).Navigation.GlobalNavigationNodes.
          Cast<SPNavigationNode>().ToList();
      }
    }
  }

  public override SiteMapNodeCollection GetChildNodes(SiteMapNode node)
  {
    var navNodes = GetNavigationNodes(node.Url).ToList();
    var navNode = navNodes.FirstOrDefault(n => n.Url == node.Url);
    if (navNode != null) navNodes= navNode.Children.Cast<SPNavigationNode>().ToList();
    var nodes = navNodes.Select(n => 
      new SiteMapNode(this, n.Url, n.Url, n.Title)).ToArray();
    return new SiteMapNodeCollection(nodes);
  }

  protected override SiteMapNode GetRootNodeCore()
  {
    var publishingNodes = GetNavigationNodes("/");
    var node = publishingNodes.FirstOrDefault();
    if (node == null) return null;
    node = node.Parent;
    return new SiteMapNode(this, node.Url, node.Url, node.Title);
  }
}

Use assim:

var menu = new AspMenu 
{
  DataSource = new SiteMapDataSource
  {
    Provider = new CustomSiteMapProvider()
  }
};
menu.DataBind();
Controls.Add(menu);

Observe que você deve ligar site.OpenWeb para cada SPWeb filho, pois SPNavigationNode pode ter 0 .Children.
Observe também que ele está usando Publicação e Portal, mas você também pode estender, por exemplo SiteMapProvider para o provedor (deve incluir mais métodos) e para nós que você pode usar web.Navigation.GlobalNodes.

Outras dicas

Então você já tem a barra de navegação mas precisa exibir os links?Já tive esse problema em Meus Sites e para resolvê-lo usei um mapa do site.

Basicamente, defini todos os meus links para a barra de navegação no mapa do site e referenciei-os na masterpage.Agora, sempre que um novo link é adicionado ao site normal, preciso atualizar o mapa do site de Meus Sites.

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top