2

PortalSiteMapProvider インスタンスをインスタンス化するたびに、常にデフォルトでルート Web サイト コレクションになります。

アプリケーションページとは別のコレクションからサイトマップを取得できるようにしたい。

このため、このアプリケーション ページは _layouts の下にあり、どのサイト コレクションでもホストされていないため、コンテキストは既定でルート Web になります。

アプリケーション ページからルート Web 以外のサイト コレクションへのインスタンスを取得するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

5

PortalSiteMapProvider を介して別のサイト コレクションの階層を読み取ることはできません。たとえば、サイト コレクション A にいる場合、PSMP は B ではなく A のツリーのみをトラバースします。B をトラバースするには、B にいる必要があります。

私が実装した回避策は、サイト コレクションで実行され、パスをパラメーターとして受け取る単純な Web サービスを作成することでした。独自の PSMP を読み取り、階層内のそのポイントから XML ツリーを書き込みます。SC-A で実行されているコードから SC-B に存在する Web サービスを呼び出すことは、特に PSMP が B の構造を非常に迅速に破ることができるため、非常に高速です。

編集:

WSS3/MOSS で Web サービスを作成する手順は次のとおりです。

正しい方向に向かうための、まったく機能しないコードを次に示します。

//method exposed through the web service
public XmlDocument GetTree(string path)
{
    PortalSiteMapProvider psmp = PortalSiteMapProvider.GlobalNavSiteMapProvider;
    SiteMapNode node = psmp.FindSiteMapNode(path);
    return BuildXmlFromNode(node);
}

private XmlNode BuildXmlFromNode(SiteMapNode node)
{
    XmlDocument xml = new XmlDocument();
    reutrn BuildXmlFromNode(node, xml);
}

//recurses down the sitemapnode children
private XmlNode BuildXmlFromNode(SiteMapNode node, XmlNode xml)
{
    XmlElement element = doc.CreateElement("Node")
    element.SetAttribute("title", node.Title);
    element.SetAttribute("url", node.Url);

    xml.AppendChild(element);

    foreach(SiteMapNode childNode in node.ChildNodes)
    {
        BuildXmlFromNode(childNode, element);
    }

    return xml;
}

再帰回数に制限を設定せず、サイト マップの階層が非常に深いか広い場合、巨大な xml ドキュメントが生成される可能性があることに注意してください。注意して使用してください!

于 2009-02-06T01:17:18.797 に答える