2009-02-06 35 views
2

每次我實例化一個PortalSiteMapProvider實例時,它總是默認爲根網站集合。PortalSiteMapProvider

我希望能夠從應用程序頁面的不同集合中獲取站點地圖。

因此,上下文默認爲根網站,因爲此應用程序頁面位於_layouts下並且不在任何網站集下託管。

如何從應用程序頁面獲取除根網站以外的網站集的實例?

謝謝。

回答

5

您無法通過PortalSiteMapProvider讀取其他網站集的層次結構。例如,如果您在網站集A中,PSMP將只遍歷A的樹,而不是B.您必須在B中遍歷B.

我實現的解決方法是編寫一個在網站中運行的簡單Web服務收集並將路徑作爲參數。它讀取自己的PSMP,並從層次結構中的該點寫入一個XML樹。從運行在SC-A中的代碼調用SC-B中的Web服務非常快,特別是因爲PSMP可以如此迅速地通過B的結構。

編輯:

Here are instructions for creating a web service in WSS3/MOSS

下面是一些完全無功能的代碼,讓你在正確的方向前進:

//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文檔。謹慎使用!

+0

你介意幫我寫一個簡單的web服務嗎?我從來沒有做過。任何指向我的方向?謝謝! – 2009-02-06 01:35:14