2012-03-13 68 views
0

我正在为visual share 2010的visual studio编写一个可视Web部件。此Web部件的全部要点是通过单击按钮来更改权限。我能够访问权限并将它们输出到屏幕上。我可以更改我拥有的对象的权限,然后在屏幕上显示更改的权限。我的问题是,一切完成后,没有实际的权限被更改。Sharepoint: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循环和其他代码做其他事情的各种位。无论如何,通过查看在线,我能够拼凑出的所有内容,此代码将“贡献”权限添加到第一个文件夹中列表上的第一个角色。正如我所说的那样,它对当地的物体是这样做的,但没有永久的效果。 Update()调用似乎什么都不做,我不确定它是否在这种情况下。我试过UpdateOverwriteVersion() - 这也没有做任何事情。对于我可能会做错的任何建议将不胜感激。

作为一个便笺,它几乎不是一个问题,但我忍不住有一种更高效和直接的方式来获取Web对象,以便我可以通过名称获取角色定义。任何关于这个问题的建议也将不胜感激。

编辑:解决方案移动到答案,下面。

+1

您应该发布您的解决方案作为答案。 – 2012-03-13 21:24:28

+0

啊。确实。完成。谢谢。 – 2012-03-14 13:13:51

回答

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