1

我已经搜索了很长时间,但我发现的每一个解决方案都不起作用。这是过程:创建页面(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

4

0 回答 0