понедельник, 27 июня 2011 г.

Проверка принадлежности текущего пользователя к аудитории для элемента навигации SharePoint

Допустим, имеется набор элементов навигации 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()))
{
    //Действия с элементом   
}

среда, 22 июня 2011 г.

Ошибка отображения списка в режиме таблицы

Давно была у меня ошибка при отображении списка в режиме таблицы.
И недавно (как всегда когда совсем приспичит) решил я её всё-таки исправить.

Ошибка была следующая:
"Невозможно отобразить этот список в представлении таблицы данных по одной или нескольким причинам:
- не установлен компонент электронной таблицы, совместимый с Windows SharePoint Foundation; 
- ваш веб-браузер не поддерживает элементы управления ActiveX.
- компонент неправильно настроен для 32-разрядной или 64-разрядной поддержки."
либо
"The list cannot be displayed in Datasheet view for one or more of the following reasons:
- A datasheet component compatible with Windows SharePoint Foundation is not installed.
- Your Web browser does not support ActiveX controls.
- A component is not properly configured for 32-bit or 64-bit support."

Вроде всё на месте, офис установлен, ActiveX включён, прав везде хватает, а не работает.

После некоторого поиска решение было найдено. Проблема оказалась всё же в офисе, вернее в том что он x64-разрядный. Необходимо скачать и установить некий "2007 Office System Driver: Data Connectivity Components".
После чего всё встаёт на свои места.
Ссылка на страницу поддержки Microsoft.