Допустим, имеется набор элементов навигации SPNavigationNodeCollection (например, web.Navigation.TopNavigationBar или web.Navigation.QuickLaunch). Необходимо выбрать из них элементы в соответствии с установленной для них аудиторией относительно текущего пользователя. Пример рабочего кода:
public static class AudienceHelper { public static bool UserInAudience(this SPNavigationNode navigationNode) { //Необходимые нам данные об аудитории находятся в свойстве элемента if (navigationNode.Properties["Audience"] == null) return true; var audiencesLine = navigationNode.Properties["Audience"].ToString(); /* * В качестве значения для аудитории может быть установлено значение одного из трёх типов: * Аудитории SharePoint * Группы безопасности * Группы SharePoint * * Информация об аудитории представляет собой строку вида "MyAudience;;MySecurityGroup;;MySPGroup" * Значения между ";;" могут отсутствовать, либо быть набором из нескольких значений разделённых "," * Для примера, * аудитория SharePoint задаётся значением "MyAudience;;;;", * две группы SharePoint - значением ";;;;MySPGroup1,MySPGroup2" */ var audiencesList = audiencesLine.Split(new[] { ";;" }, StringSplitOptions.None).ToList(); if (string.IsNullOrEmpty(audiencesLine) || audiencesList.Count < 3) return true; /* Для проверки наличия текущего пользователя в аудитории необходим объект AudienceLoader * из библиотеки Microsoft.Office.Server*/ var audienceLoader = AudienceLoader.GetAudienceLoader(); if (!string.IsNullOrEmpty(audiencesList[0])) { var audiences = audiencesList[0].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (audiences.Any(audienceLoader.IsUserMemberOfGlobalAudience)) return true; } if (!string.IsNullOrEmpty(audiencesList[1])) { var audiences = audiencesList[1].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (audiences.Any(audienceLoader.IsUserMemberOfDL)) return true; } if (!string.IsNullOrEmpty(audiencesList[2])) { var audiences = audiencesList[2].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); if (audiences.Any(audienceLoader.IsUserMemberOfSharePointGroup)) return true; } //Если пользователь не содержится не в одном из типов аудиторий возвращаем False return false; } } Теперь можем перебрать все элементы: foreach (var navItem in web.Navigation.TopNavigationBar.Cast<SPNavigationNode>().Where(nn => nn.IsVisible && nn.UserInAudience())) { //Действия с элементом }
Взято из: http://www.aviw.net/2011/06/sharepoint.html
Комментариев нет:
Отправить комментарий