Проблема итерации узла семейства сайтов в SharePoint 2010 - PullRequest
0 голосов
/ 22 февраля 2011

Я перебираю свои семейства сайтов в SharePoint для настраиваемой навигации. Но я пытаюсь разрешить итерации выводить узлы только одного уровня после / sites /. Например, сайты / IT.

В данный момент мой метод повторяется по всем узлам. Например, сайты / IT / Support.

private void GetSiteChildNodes(string siteName)
    {
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            foreach (SPSite site in SPContext.Current.Site.WebApplication.Sites)
            {
                try
                {
                    if (SPSite.Exists(new Uri(site.Url)) && site.ServerRelativeUrl.StartsWith(String.Format("/sites/{0}/", siteName)))
                    {
                        SPWeb subSites = site.RootWeb;

                        foreach (SPWeb cn in subSites.Webs)
                        {                                
                            navBuilder.AppendFormat("<li><a href=\"{0}\">{1}</a></li>", cn.Url, cn.Title);
                        }                            
                    }
                }
                finally
                {
                    site.Dispose();
                }
            }
        });
    }

Как вы можете видеть из моего кода, я использую "RootWeb", чтобы игнорировать любые дочерние узлы внутри сайта. Но это не работает.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

После прочтения вашего комментария, @ R100, если у вас есть управляемые пути, определенные для ваших дочерних сайтов, то каждый управляемый путь (независимо от логической иерархии, которую вы создали) находится на одном уровне в коллекции SPWebApplication.Sites.

Например, если у вас есть следующая иерархия:

  • Root (/) [Семейство сайтов]
    • Сайты (/ сайты) [Семейство сайтов]
    • IT (/ sites / IT) [Семейство сайтов]
    • Поддержка (/ sites / IT / Support) [Семейство сайтов]

тогда SPWebApplication.Sites будет содержать каждый из перечисленных выше элементов в единой коллекции

Кроме того, ServerRelativeUrl для семейств сайтов относится к корню установки SharePoint. Таким образом, то, что вы видите в скобках в вышеприведенной иерархии, это ServerRelativeUrl для каждого из узлов.

Таким образом, ваша проверка, когда вы перебираете свои значения, истинна для каждого дочернего семейства сайтов в / sites / it (если вы передаете имя siteName):

site.ServerRelativeUrl.StartsWith(String.Format("/sites/{0}/", siteName))
0 голосов
/ 22 февраля 2011

Попробуйте это:

используя (SPSite oSiteCollection = новый SPSite ("http://<>")) {SPWeb web = oSiteCollection.OpenWeb (" sites ");

            foreach (SPWeb oWebsite in web.Webs)
            {
                Console.WriteLine("Web site: {0}", oWebsite.Url);
                oWebsite.Dispose();
            }
       }
...