我想遍历网站集中的所有网站,并更改某个网站的权限。
我的代码是:
SPSite oSiteCollection = SPContext.Current.Site;
SPWebCollection collWebsite = oSiteCollection.AllWebs;
foreach (SPWeb web in collWebsite)
{
web.AllowUnsafeUpdates = true;
if (web.Name == "SiteName")
{
web.BreakRoleInheritance(true);
string[] groups = new string[2] { "Group1", "Group2" };
foreach (string item in groups)
{
SPGroup removeGroup = web.SiteGroups[item];
web.RoleAssignments.Remove(removeGroup);
SPGroup addGroup = web.SiteGroups[item];
SPRoleDefinition roleDefinition = web.RoleDefinitions["Read"];
SPRoleAssignment roleAssignment = new SPRoleAssignment(addGroup);
roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
web.RoleAssignments.Add(roleAssignment);
}
}
}
但它给了我一个错误
Error changing permissions, details: There are uncommitted changes on the SPWeb object, call SPWeb.Update() to commit the changes before calling this method.
如果我想要做同样的事情但是代码
,代码工作得很好 SPListCollection collList = web.Lists;
foreach (SPList oList in collList)
{
//and so on
我尝试将web.Update()放在不同的地方,但没有成功。有什么想法吗?
提前致谢。
修改
我评论了大部分内容并且只留下了
if (web.Name == "SiteName")
{
web.BreakRoleInheritance(true);
web.Update();
}
但它仍然会引发同样的错误。
答案 0 :(得分:1)
我会尝试SPWeb.Update
,然后
using(var newWeb = site.OpenWeb(web.ID))
{
web.BreakRoleInheritance(true);
web.Update();
}
另外,不要忘记在foreach循环中打开的所有SPWeb.Dispose
上执行AllWebs
。
答案 1 :(得分:1)
如果您在功能中使用此代码,请确保使用Web级别功能。不要在站点级别功能中循环遍历AllWebs。
将功能范围更改为Web并尝试以下代码
using (SPWeb oWeb = SPContext.Current.Web)
{
web.AllowUnsafeUpdates = true;
web.BreakRoleInheritance(true);
string[] groups = new string[2] { "Group1", "Group2" };
foreach (string item in groups)
{
SPGroup removeGroup = web.SiteGroups[item];
web.RoleAssignments.Remove(removeGroup);
SPGroup addGroup = web.SiteGroups[item];
SPRoleDefinition roleDefinition = web.RoleDefinitions["Read"];
SPRoleAssignment roleAssignment = new SPRoleAssignment(addGroup);
roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
web.RoleAssignments.Add(roleAssignment);
}
web.AllowUnsafeUpdates = false;
}
在所需网站中激活此功能以应用权限。
答案 2 :(得分:0)
我不确定问题是什么。 但可能会发生DLL没有更新。它发生在我身上好几次。 尝试从x:/ windows / assembly中删除DLL,然后重新部署解决方案以查看行为是否有任何更改。 同时尝试在此之前提交更改(我确定您已经尝试过)
此致
佩德罗