Проблема с итерацией узла семейства сайтов в SharePoint 2010

#sharepoint #sharepoint-2010 #navigation #web-parts

#sharepoint #sharepoint-2010 #навигация #веб-части

Вопрос:

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

На данный момент мой метод выполняет итерацию по всем узлам. Например, сайты / ИТ / поддержки.

 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)) amp;amp; 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», чтобы игнорировать любые дочерние узлы внутри сайта. Но это не работает.

Будем признательны за любую помощь.

Ответ №1:

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

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

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

Комментарии:

1. Спасибо за ответ. Это кажется лучшим способом. Я попробую это сделать.

2. Я попробовал это, и это не работает. Возможно, это потому, что мой сайт использует семейство сайтов с управляемыми путями.

Ответ №2:

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

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

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

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

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

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

 site.ServerRelativeUrl.StartsWith(String.Format("/sites/{0}/", siteName))