我正在尝试为我的MOSS发布网站创建一个站点地图,我有两种方法,但似乎两者都没有。
我的第一种方法是使用PortalSiteMapProvider,它已经创建并且很好地缓存...
PublishingWeb rootWeb = PublishingWeb.GetPublishingWeb(SPContext.Current.Site.RootWeb);
//Get the URL of the default page in the web
string defaultPageUrl = rootWeb.DefaultPage.ServerRelativeUrl;
PortalListItemSiteMapNode webNode = (PortalListItemSiteMapNode)PortalSiteMapProvider.CurrentNavSiteMapProviderNoEncode.FindSiteMapNode(defaultPageUrl);
HttpContext.Current.Response.Output.WriteLine("Top Level: " + webNode.Title.ToString() + "<br />");
//iterate through each one of the pages and subsites
foreach (SiteMapNode smnTopLevelItem in webNode.ParentNode.ChildNodes)
{
HttpContext.Current.Response.Output.WriteLine(smnTopLevelItem.Title.ToString() + "<br />");
//if the current sitemap has children, create a submenu for it
if (smnTopLevelItem.HasChildNodes)
{
foreach (SiteMapNode smnChildItem in smnTopLevelItem.ChildNodes)
{
HttpContext.Current.Response.Output.WriteLine(smnChildItem.Title.ToString() + "<br />");
}
}
}
HttpContext.Current.Response.End();
但这似乎返回了网站集中的所有内容(例如列表,surverys)。我只想展示Sharepoint网站。
我的另一种方法是使用这段代码..
SPSite siteCollection = new SPSite("http://example.org");
SPWebCollection sites = siteCollection.AllWebs;
foreach (SPWeb site in sites)
{
Console.WriteLine(site.Title.ToString() + " " + site.ServerRelativeUrl.ToString());
}
除了在平面列表中返回所有网页的问题之外,这是完美的。
理想情况下,我希望能够添加缩进以显示子网。
答案 0 :(得分:6)
通常,使用对象模型进行递归是个坏主意。这样做非常缓慢且资源密集。 PortalSiteMapProvider
已预先缓存,可以在几毫秒内完成整个网站结构。
关于SPSite.AllWebs
的问题,该属性会返回所有网站的详细列表。这就是它的用途。如果您只想要直接子网站的列表,请使用SPSite.RootWeb.Webs
属性。递归SPWeb
属性中的每个.Webs
,并依次调用其.Webs
属性以获取树视图。
此外,在处理对象模型时,请确保对每个网站和网站进行配置。如果不这样做,这将导致史诗般的坏问题。这包括在.Webs
集合中处理每个网页,即使您没有触及它。
编辑:
要使PortalSiteMapProvider仅返回网络,请将其IncludePages
属性设置为false
。
答案 1 :(得分:2)
您是否尝试使用PortalSiteMapNode.Type属性检查foreach循环中每个节点的类型,并仅显示NodeTypes.Area类型的节点?
答案 2 :(得分:1)
感谢大家的回复,这就是我想出来的
public ListSiteMap()
{
PortalSiteMapProvider portalProvider1 = PortalSiteMapProvider.WebSiteMapProvider;
portalProvider1.DynamicChildLimit = 0;
portalProvider1.EncodeOutput = true;
SPWeb web = SPContext.Current.Site.RootWeb;
PortalSiteMapNode webNode = (PortalSiteMapNode)portalProvider1.FindSiteMapNode(web.ServerRelativeUrl);
if (webNode == null || webNode.Type != NodeTypes.Area) return;
Console.WriteLine(webNode.Title.ToString() + " - " + webNode.Description.ToString());
// get the child nodes (sub sites)
ProcessSubWeb(webNode);
}
private void ProcessSubWeb(PortalSiteMapNode webNode)
{
foreach (PortalSiteMapNode childNode in webNode.ChildNodes)
{
Console.WriteLine(childNode.Title.ToString() + " - " + childNode.Description.ToString());
//if the current web has children, call method again
if (childNode.HasChildNodes)
{
ProcessSubWeb(childNode);
}
}
}
我发现这些文章有帮助
http://blogs.mosshosting.com/archive/tags/SharePoint%20Object%20Model/default.aspx
答案 3 :(得分:1)