Sharepoint / MOSSサイトマップの作成
-
22-07-2019 - |
質問
MOSSパブリッシングサイトのサイトマップを作成しようとしています。2つのアプローチがありますが、両方にこだわっているようです。
最初のアプローチはPortalSiteMapProviderを使用することです。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();
しかし、これはサイトコレクション内のすべて(リスト、調査など)を返すようです。 Sharepoint Webのみを表示します。
他のアプローチは、このコードを使用することでした。
SPSite siteCollection = new SPSite("http://example.org");
SPWebCollection sites = siteCollection.AllWebs;
foreach (SPWeb site in sites)
{
Console.WriteLine(site.Title.ToString() + " " + site.ServerRelativeUrl.ToString());
}
すべてのWebをフラットリストで返すという問題を除けば、これは完璧です。
理想的には、インデントを追加して子Webを表示できるようにします。
解決 3
全員の返信に感謝、これが私が思いついたものです
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
http://www.hezser.de/blog/archive /tags/SPQuery/default.aspx
他のヒント
一般に、オブジェクトモデルを再帰に使用することはお勧めできません。これを行うのは非常に遅く、リソースを大量に消費します。 PortalSiteMapProvider
は事前にキャッシュされており、サイト構造全体をミリ秒単位で破棄できます。
SPSite.AllWebs
に関する質問については、そのプロパティはすべてのWebのフラットリストを返します。それが目的です。 即時子Webのみのリストが必要な場合は、 SPSite.RootWeb.Webs
プロパティを使用します。 .Webs
プロパティ内の各 SPWeb
を再帰処理し、それらの .Webs
プロパティを順番に呼び出して、ツリービューを取得します。
また、オブジェクトモデルを扱う場合は、すべてのWebおよびサイトを分散してください。そうしないと、これは重大な問題を引き起こします。これには、触れていない場合でも、 .Webs
コレクション内のすべてのWebの破棄が含まれます。
編集:
PortalSiteMapProviderがWebのみを返すようにするには、 IncludePages
プロパティを false
に設定します。
PortalSiteMapNode.Typeプロパティを使用してforeachループ内のすべてのノードのタイプを確認し、NodeTypes.Areaタイプのノードのみを表示しようとしましたか?