【问题标题】:Sharepoint: web part programmatically changing permissions, cannot get the changes to persistSharepoint:Web 部件以编程方式更改权限,无法使更改持久化
【发布时间】:2012-03-30 00:47:09
【问题描述】:

我正在 Visual Studio 中为 sharepoint 2010 编写一个可视化 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”权限添加到第一个文件夹中列表中的第一个角色。正如我所提到的,它对本地对象这样做,但没有永久效果。 Update() 调用似乎什么也没做,我不确定在这种情况下它是否应该存在。我尝试了 UpdateOverwriteVersion() - 它也没有做任何事情。任何关于我可能做错的建议将不胜感激。

顺便说一句,这几乎不是什么大问题,但我不禁觉得有一种更有效、更直接的方式来获取 Web 对象,这样我就可以通过名称获取角色定义。对此问题的任何建议也将不胜感激。

编辑:解决方案移至下面的答案。

【问题讨论】:

  • 您应该发布您的解决方案作为答案。
  • 啊。确实。完毕。谢谢。

标签: sharepoint sharepoint-2010 permissions web-parts


【解决方案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);

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2014-10-13
    相关资源
    最近更新 更多