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

Я пишу визуальную веб-часть в 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 ответ

Решение

Я нашел ответы как на основание, так и на примечание.

Что касается примечания, следующее выглядит так, как будто это намеченный способ получить соответствующий объект 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);
Другие вопросы по тегам