我正在为visualpoint 2010中的visual studio编写一个可视化Web部件。此Web部件的重点是通过单击按钮更改权限。我可以访问权限并将其输出到屏幕。我可以更改我拥有的对象的权限,然后在屏幕上显示更改的权限。我的问题是,一切都完成后,没有实际的权限被更改。
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”priv添加到第一个文件夹列表中的第一个角色。正如我所提到的,它对本地对象这样做,但没有永久效果。 Update()调用似乎什么都不做,我不确定它是否适用于这种情况。我尝试过UpdateOverwriteVersion() - 它也没有做任何事情。对于我可能做错的任何建议都将不胜感激。
作为旁注,这并不是一个问题,但我无法理解有一种更有效和直接的方式来获取Web对象,以便我可以通过名称获取角色定义。关于这个问题的任何建议也将受到赞赏。
编辑:解决方案已移至下方回答。
答案 0 :(得分: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);