В отличие от реальных списков, Папка не может быть сделана «скрытой» в обычном смысле. То есть вы не можете сделать его невидимым для пользовательского интерфейса, но при этом все равно будете иметь все обычные уровни доступа, связанные с ним (например, традиционный список истории рабочих процессов скрыт таким образом). В некотором смысле, ваши цели скрыть и сделать его доступным только для чтения совпадают, когда дело доходит до папок, так как оба они выполняются с помощью прав доступа. Технически вы можете уменьшить видимость определенного элемента с помощью сложного фильтра представления, но это только изменит вещи на уровне представления.
Видимость элемента списка, которым является папка, зависит от того, есть ли у вас права доступа к этому элементу. Единственный способ действительно «спрятать» элемент списка - это удалить все разрешения человека из этого элемента списка. Чтобы сделать папку доступной только для чтения, необходимо удалить все разрешения на добавление, редактирование и удаление из папки. Если у вас все еще есть уровни разрешений SharePoint по умолчанию («Полный доступ», «Дизайн», «Contribute» и «Чтение»), то просто переназначение всего «Чтение» выполнит эту задачу.
Вот пример кода, который я использую, чтобы сделать обсуждение (которое является папкой) скрытым от всех пользователей, кроме пользователей из группы «Инженеры», которым он доступен только для чтения.
// I excluded these two variable declarations because they were specific to
// my situation.
// Giving you my variable declarations would be misleading, since this is
// meant to be a generic code sample.
// SPListItem folder is the folder I am working on.
// SPWeb web is the SPWeb for the site I am on.
if (!folder.HasUniqueRoleAssignments)
{
folder.BreakRoleInheritance(false); //Setting false erases all permissions, so now the folder is hidden from everyone.
folder.SystemUpdate(false);
}
SPRoleDefinition role = web.RoleDefinitions["Read"];
SPPrincipal smith = web.SiteGroups["Engineers"]; //You would replace "Engineers" with the name of whatever group you want to have read permissions. Or, use web.SiteUsers[] to get a specific user.
SPRoleAssignment roleAssignment = new SPRoleAssignment(smith);
roleAssignment.RoleDefinitionBindings.Add(role);
folder.RoleAssignments.Remove(smith); //If I have already assigned a different permission, this will clear it so that I ensure that the only permission is Read.
folder.RoleAssignments.Add(roleAssignment); //This sets it to Read-Only for these people.
folder.SystemUpdate(false);
EDIT
При назначении нескольких экземпляров это зависит от того, выполняете ли вы все группы или только подмножество. Я перечислю код для всех групп, так как это то, что вы прямо спрашиваете.
if (!folder.HasUniqueRoleAssignments)
{
folder.BreakRoleInheritance(false); //Setting false erases all permissions, so now the folder is hidden from everyone.
folder.SystemUpdate(false);
}
SPRoleDefinition role = web.RoleDefinitions["Read"];
SPRoleAssignment roleAssignment;
foreach (SPPrincipal smith = web.SiteGroups)
{
roleAssignment = new SPRoleAssignment(smith);
roleAssignment.RoleDefinitionBindings.Add(role);
folder.RoleAssignments.Remove(smith);
folder.RoleAssignments.Add(roleAssignment);
}
folder.SystemUpdate(false);
Если вы хотите сделать это только для подмножества групп, вы должны определить список имен всех этих групп, сделать foreach (string groupName in groupList)
, и в качестве первой строки цикла указать SPPrincipal smith = web.SiteGroups[groupName];
.