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);