我已经搜索了很长时间,但我发现的每一个解决方案都不起作用。这是过程:创建页面(ListItem)->更改字段值->签入->错误
错误:System.ArgumentOutOfRangeException
代码:
public override void ItemUpdated(SPItemEventProperties properties, bool isCheckedIn)
{//FUNKTIONSFÄHIG
EventFiringEnabled = false;
if (isCheckedIn)
{
SetRights(properties);
}
else
{
return;
}
EventFiringEnabled = true;
}
public static void AssignPermissionsToItem(SPListItem item, SPPrincipal obj, SPRoleType roleType)
{//FUNKTIONSFÄHIG
SPRoleAssignment roleAssignment = new SPRoleAssignment(obj);
SPRoleDefinition roleDefinition = item.Web.RoleDefinitions.GetByType(roleType);
roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
item.RoleAssignments.Add(roleAssignment);
//item.Update();
}
private static void SetRights(SPItemEventProperties properties)
{//FUNKTIONSFÄHIG
SPListItem currentItem = properties.ListItem;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
SPUserToken sysToken = null;
using (SPSite site = new SPSite(properties.ListItem.Web.Site.ID))
{
sysToken = site.UserToken;
using (SPSite impersonatedSite = new SPSite(properties.ListItem.Web.Site.ID, sysToken))
{
bool siteUnsafeUpdates = impersonatedSite.AllowUnsafeUpdates;
impersonatedSite.AllowUnsafeUpdates = true;
using (SPWeb web = impersonatedSite.OpenWeb(properties.ListItem.Web.ID))
{
SPUser user = web.CurrentUser;
SPList elevatedList = web.Lists[currentItem.ParentList.ID];
try
{
SPList RechteMapping = web.GetList(Configuration.ReadWebConfigAppSetting(web, "WikiRechteMappingList"));
String TaxonomieSpalte = Configuration.ReadWebConfigAppSetting(web, "TaxonomieSpalte");
String ADSpalte = Configuration.ReadWebConfigAppSetting(web, "ADSpalte");
bool webUnsafeUpdates = web.AllowUnsafeUpdates;
web.AllowUnsafeUpdates = true;
SPListItem li = elevatedList.GetItemById(currentItem.ID);
li.BreakRoleInheritance(false);
while (li.RoleAssignments.Count > 0)
{
li.RoleAssignments.Remove(0);
}
// Rechte für aktuellen Bearbeiter
AssignPermissionsToItem(li, user, SPRoleType.Contributor);
// Rechte für Ersteller/Autor
AssignPermissionsToItem(li, web.EnsureUser(li["Author"].ToString().Split('#')[1]), SPRoleType.Contributor);
// Rechte für letzen Bearbeiter
AssignPermissionsToItem(li, web.EnsureUser(li["Editor"].ToString().Split('#')[1]), SPRoleType.Contributor);
// Lese AD-Gruppe für Taxonomieauswahl Verantwortliche Abteilung
TaxonomyFieldValue verantwAbteilung = (TaxonomyFieldValue)li["Verantwortliche Abteilung"];
SPQuery rechteGruppeQuery = new SPQuery();
String queryPre = "<Where><Eq><FieldRef Name='" + TaxonomieSpalte + "' LookupId='True' /><Value Type='Integer'>";
String queryPost = "</Value></Eq></Where>";
String query = queryPre + verantwAbteilung.WssId + queryPost;
rechteGruppeQuery.Query = query;
SPListItemCollection rechte = RechteMapping.GetItems(rechteGruppeQuery);
// Setze Rechte für AD-gruppe aus Taxonomieauswahl Verantwortliche Abteilung
if (rechte.Count > 0)
{
user = web.EnsureUser(rechte[0][ADSpalte].ToString().Split('#')[1]);
AssignPermissionsToItem(li, user, SPRoleType.Contributor);
}
// Lese AD-Gruppe für Taxonomieauswahl Betroffene Abteilung
TaxonomyFieldValueCollection betroffeneAbteilung = (TaxonomyFieldValueCollection)li["Betroffene Abteilung/gültig für"];
if (betroffeneAbteilung != null)
{
foreach (TaxonomyFieldValue abtlg in betroffeneAbteilung)
{
// Setze Rechte für AD-gruppe aus Taxonomieauswahl Betroffene Abteilung
query = queryPre + abtlg.WssId + queryPost;
rechteGruppeQuery = new SPQuery();
rechteGruppeQuery.Query = query;
rechte = RechteMapping.GetItems(rechteGruppeQuery);
if (rechte.Count > 0)
{
user = web.EnsureUser(rechte[0][ADSpalte].ToString().Split('#')[1]);
AssignPermissionsToItem(li, user, SPRoleType.Contributor);
}
query = null;
rechte = null;
}
}
web.AllowUnsafeUpdates = webUnsafeUpdates;
web.Dispose();
}
catch (Exception ex)
{
SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("EventReceiver_WikiBerechtigungen", TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
}
}
impersonatedSite.AllowUnsafeUpdates = siteUnsafeUpdates;
impersonatedSite.Dispose();
}
}
});
}
我创建了自己的基类以防止事件触发两次(在保存页面和签入时)。
我不知道我在哪里犯了错误。请帮助我:D