Допустим, имеется набор элементов навигации 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();
#region Global audience
if (!string.IsNullOrEmpty(audiencesList[0]))
{
var audiences = audiencesList[0].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (audiences.Any(audienceLoader.IsUserMemberOfGlobalAudience))
return true;
}
#endregion
#region Security group
if (!string.IsNullOrEmpty(audiencesList[1]))
{
var audiences = audiencesList[1].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (audiences.Any(audienceLoader.IsUserMemberOfDL))
return true;
}
#endregion
#region SharePoint group
if (!string.IsNullOrEmpty(audiencesList[2]))
{
var audiences = audiencesList[2].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (audiences.Any(audienceLoader.IsUserMemberOfSharePointGroup))
return true;
}
#endregion
//Если пользователь не содержится не в одном из типов аудиторий возвращаем False
return false;
}
}
Теперь можем перебрать все элементы:
foreach (var navItem in web.Navigation.TopNavigationBar.Cast<SPNavigationNode>().Where(nn => nn.IsVisible && nn.UserInAudience()))
{
//Действия с элементом
}
Необходимо выбрать из них элементы в соответствии с установленной для них аудиторией относительно текущего пользователя.
Для данной задачи я создал следующий класс:
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();
#region Global audience
if (!string.IsNullOrEmpty(audiencesList[0]))
{
var audiences = audiencesList[0].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (audiences.Any(audienceLoader.IsUserMemberOfGlobalAudience))
return true;
}
#endregion
#region Security group
if (!string.IsNullOrEmpty(audiencesList[1]))
{
var audiences = audiencesList[1].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (audiences.Any(audienceLoader.IsUserMemberOfDL))
return true;
}
#endregion
#region SharePoint group
if (!string.IsNullOrEmpty(audiencesList[2]))
{
var audiences = audiencesList[2].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
if (audiences.Any(audienceLoader.IsUserMemberOfSharePointGroup))
return true;
}
#endregion
//Если пользователь не содержится не в одном из типов аудиторий возвращаем False
return false;
}
}
Теперь можем перебрать все элементы:
foreach (var navItem in web.Navigation.TopNavigationBar.Cast<SPNavigationNode>().Where(nn => nn.IsVisible && nn.UserInAudience()))
{
//Действия с элементом
}
Комментариев нет:
Отправить комментарий