2

MOSS パブリッシング サイトのサイトマップを作成しようとしています。2 つのアプローチがありますが、どちらも行き詰っているようです。

私の最初のアプローチは、既に作成され、適切にキャッシュされている 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 を表示できるようにしたいと考えています。

4

4 に答える 4

6

一般に、オブジェクト モデルを再帰に使用するのはお勧めできません。これを行うには非常に時間がかかり、リソースを大量に消費します。PortalSiteMapProvider事前にキャッシュされており、サイト構造全体を数ミリ秒で引き裂くことができます。

に関するご質問についてSPSite.AllWebsは、そのプロパティはすべての Web のフラット リストを返します。それがそのためです。直接の子 Webのみのリストが必要な場合は、SPSite.RootWeb.Websプロパティを使用します。SPWebプロパティ内のそれぞれを再帰し.Webs、それらのプロパティを順番に呼び出して.Websツリー ビューを取得します。

また、オブジェクト モデルを扱うときは、 必ずDISPOSE EVERY WEB AND SITEにしてください。そうしないと、これは壮大な悪い問題を引き起こします。.Websこれには、コレクションに触れていなくても、コレクション内のすべての Web を破棄することが含まれます。

編集:

PortalSiteMapProvider が Web のみを返すようにするには、そのIncludePagesプロパティをに設定しますfalse

于 2009-06-24T16:32:43.830 に答える
2

PortalSiteMapNode.Typeプロパティを使用して、foreachループ内のすべてのノードのタイプを確認し、NodeTypes.Areaタイプのノードのみを表示してみましたか?

于 2009-06-24T19:33:33.050 に答える
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.msdn.com/ecm/archive/2007/05/23/increased-performance-for-moss-apps-using-the-portalsitemapprovider.aspx

http://blogs.mosshosting.com/archive/tags/SharePoint%20Object%20Model/default.aspx

http://www.hezser.de/blog/archive/tags/SPQuery/default.aspx

于 2009-06-26T09:38:36.347 に答える
1

このツールを使用できます:

http://realworldsa.blogspot.com/2010/12/new-tool-for-sharepoint-2007-and-2010.html

于 2010-12-09T14:23:53.867 に答える