#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))