2009-06-24 4 views
2

MOSS 게시 사이트 용 사이트 맵을 만들려고하고 있는데 두 가지 방법이 있지만 두 가지 방법이 있습니다. (예를 들어, 목록, surverys)셰어 포인트 만들기/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(); 

를 사용하는 것입니다하지만이 사이트 모음의 모든 것을 반환하는 것 같다. 나는 셰어 포인트 웹을 보여주고 싶다.

내 다른 접근 방법은 ..이 코드 조각을 사용하여 떨어져 단순 목록에있는 모든 웹을 반환하는 문제에서 완벽

SPSite siteCollection = new SPSite("http://example.org"); 
SPWebCollection sites = siteCollection.AllWebs; 
foreach (SPWeb site in sites) 
{ 
    Console.WriteLine(site.Title.ToString() + " " + site.ServerRelativeUrl.ToString()); 
} 

했다.

이상적으로 나는 하위 웹을 보여주기 위해 들여 쓰기를 추가 할 수 있기를 원합니다.

답변

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://www.hezser.de/blog/archive/tags/SPQuery/default.aspx

6

일반적으로 재귀를 위해 객체 모델을 사용하는 것은 좋지 않습니다. 이 작업은 매우 느리고 자원 집약적입니다. PortalSiteMapProvider은 미리 캐싱되며 밀리 초 단위로 전체 사이트 구조를 찢어 낼 수 있습니다.

SPSite.AllWebs에 관한 질문에서 해당 속성은 모든 웹의 목록을 반환합니다. 그것이 바로 그 때문입니다. 즉시 하위 웹 목록 만 표시하려면 SPSite.RootWeb.Webs 속성을 사용하십시오. .Webs 속성에있는 각 SPWeb에 대해 재귀를 수행하고 차례로 .Webs 속성을 호출하여 트리보기를 만듭니다.

또한 개체 모델을 다루는 경우 모든 웹 사이트 및 사이트을 삭제해야합니다. 당신이하지 않으면 서사시 나쁜 문제가 발생합니다. 여기에는 터치하지 않은 경우에도 .Webs 컬렉션의 모든 웹을 삭제하는 것이 포함됩니다.

편집 :

가 PortalSiteMapProvider는 웹을 반환하려면 false에 그 IncludePages 속성을 설정합니다.

+0

확인 멋진, 내가 PortalSiteMapProvider을 사용하고 싶습니다하지만 난 단지 웨브하기 위해 출력을 제한하는 방법을 확실 해요. – Rob

2

PortalSiteMapNode.Type 속성을 사용하고 NodeTypes.Area 유형의 노드 만 표시하면 foreach 루프의 모든 노드 유형을 확인해 보았습니까? replys 모두에 대한

+0

우수 답변! – Colin