Sharepoint: веб-часть, программно изменяющая разрешения, не может сохранить изменения - PullRequest
0 голосов
/ 13 марта 2012

Я пишу визуальную веб-часть в visual studio для sharepoint 2010. Смысл этой веб-части состоит в том, чтобы изменять разрешения одним нажатием кнопки.Я могу получить доступ к разрешениям и вывести их на экран.Я могу изменить разрешения для объектов, которые у меня есть, а затем показать измененные разрешения на экране.Моя проблема в том, что после того, как все сделано, никакие фактические разрешения не были изменены.

webpart.TargetLibrary - текстовое поле, введенное в другом месте как имя библиотеки, которую я хочу исследовать.

SPListCollection docLibs = m_SharePointWeb.GetListsOfType(SPBaseType.DocumentLibrary);
SPDocumentLibrary targetLib = (SPDocumentLibrary)(docLibs[webPart.TargetLibrary]);
SPListItemCollection libFolders = targetLib.Folders;
  SPListItem folderItem = libFolders[0];
  SPRoleAssignmentCollection folderRoles = folderItem.RoleAssignments;
    SPRoleAssignment roleAssign = folderRoles[0];
    SPRoleDefinitionBindingCollection spRDBC = roleAssign.RoleDefinitionBindings;
    SPRoleDefinition Contribute = spRDBC[0].ParentWeb.RoleDefinitions["Contribute"];
  folderItem.RoleAssignments[0].RoleDefinitionBindings.Add(Contribute);
  folderItem.Update();    

Это несколько упрощенная версия - в оригинале были циклы for и различные фрагменты кода, выполняющие другие операцииНезависимо от всего, что я смог собрать воедино, просматривая онлайн, этот код должен добавить "Contribute" privs к первой роли в списке в первой папке.Как я уже говорил, это относится к местным объектам, но не имеет постоянного эффекта.Вызов Update (), кажется, ничего не делает, и я не уверен, что он должен быть там в этом случае.Я попытался UpdateOverwriteVersion () - это тоже ничего не делает.Буду признателен за любые предположения о том, что я могу делать неправильно.

В качестве примечания, это не такая уж большая проблема, но я не могу избавиться от ощущения, что есть более эффективный и простой способполучить веб-объект, чтобы я мог получить определения роли по имени.Любые советы по этому вопросу также будут оценены.

Редактировать: решение перенесено, чтобы ответить, ниже.

1 Ответ

1 голос
/ 14 марта 2012

Я нашел ответы как на основную, так и на боковую заметку.

Что касается примечания, следующее выглядит так, как будто он предназначен для получения соответствующего объекта SPWeb.

SPContext.Current.Web.RoleDefinitions["Contribute"];

Для базы проблема в том, что Sharepoint явно не сохраняет изменяющиеся роли внутри SPRoleAssignment - только предоставляя или удаляя разрешения для папки в целом.Это может или не может быть связано с тем, что я работал внутри папки.В любом случае, чтобы сохранить его, вам нужно удалить человека из SPRoleAssignmentCollection, внести изменения в его SPRoleAssignment, а затем повторно добавить измененную версию.Правильная версия приведенного выше кода (объединяющая оба ответа) приведена ниже.

SPRoleDefinition Contribute = SPContext.Current.Web.RoleDefinitions["Contribute"];
SPListCollection docLibs = m_SharePointWeb.GetListsOfType(SPBaseType.DocumentLibrary);
SPDocumentLibrary targetLib = (SPDocumentLibrary)(docLibs[webPart.TargetLibrary]);
SPListItemCollection libFolders = targetLib.Folders;
  SPListItem folderItem = libFolders[0];
  SPRoleAssignmentCollection folderRoles = folderItem.RoleAssignments;
    SPRoleAssignment roleAssign = folderRoles[0];
    folderRoles.Remove(roleAssign.Member);
    roleAssign.RoleDefinitionBindings.Add(Contribute);
    folderRoles.Add(roleAssign);
...