2012-03-13 70 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);