Программно вы имеете в виду?
SPSite.AllWebs
Использовать SPSite.AllWebs свойство, которое
Получает коллекцию всех веб-сайтов.
которые содержатся на сайте
коллекция, в том числе на высшем уровне
сайт и его подсайты.
Однако для ваших пользователей вы, вероятно, просто получите UnauthorizedAccessException (если вы не выберете заполнение DropDownList с повышенными привилегиями, но это зависит от того, что вы не хотите делать с этим раскрывающимся списком), потому что не у всех есть права перечислять все сети.
SPWeb.GetSubwebsForCurrentUser
В этом случае вы используете метод SPWeb.GetSubwebsForCurrentUser, который
Возвращает коллекцию дочерних сайтов.
под текущим веб-сайтом которого
текущий пользователь является участником.
Однако этот метод возвращает только дочерние сайты ниже (то есть на 1 уровень) текущей сети. Вам нужно будет выполнить рекурсивный цикл и вызвать GetSubWebsForCurrentUser для каждого найденного SPWeb .. err
Я бы порекомендовал ...
Вы можете использовать SPSecurity.RunWithElevatedPrivileges для вызова SPSite.AllWebs, затем на каждом полученном SPWeb проверьте, нужны ли пользователю разрешения, если да, добавьте элемент в DropDownList.
В коде это выглядит примерно так:
DropDownList ddl = new DropDownList();
SPUser currentUser = SPContext.Current.Web.CurrentUser;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite elevatedSite = new SPSite(SPContext.Current.Site.ID)) //you MUST create new SPSite instance
{
SPWebCollection elevatedWebs = elevatedSite.AllWebs;
foreach (SPWeb elevatedWeb in elevatedWebs)
{
try
{
if (elevatedWeb.DoesUserHavePermissions(currentUser.LoginName, SPBasePermissions.ViewPages))
ddl.Items.Add(new ListItem(elevatedWeb.Title, elevatedWeb.ID.ToString()));
}
finally
{
if (elevatedWeb != null)
elevatedWeb.Dispose();
}
}
}
});