Exibir navegação de outro conjunto de sites
-
09-12-2019 - |
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" />
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!