SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




EventReceiver funktioniert nicht

Geprüfte Antwort Dieser Beitrag hat 1 Antworten

Ohne Rang
2 Beiträge
Michael Richter erstellt 29 Juni 2009 08:09
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Guten Morgen miteinander,

 

im Rahmen eines betriebsinternen Projektes stoßen wir derzeit auf das Problem, dass ein Event-Receiver nicht reagiert, möglichweise auch gar nicht angehängt wird.

Innerhalb eines Features wurde ein ItemDeleted an eine Library angehängt. Dieser sollte bei Löschung eines Dokumentes aus dieser Library bestimmte Dokumente einer anderen Library innerhalb der selben Site löschen. Diese Dokumente werden anhand eines MetaTags identifiziert.

Umgebung:

Sharepoint 2007 auf W2K8 SP1 mit IIS7

Entwickelt wird in Visual Studio 2008 mit C#, WSPBuilder 0.9.8.0830

 

Feature-Beschreibung:

Es soll ermöglicht werden, dass ein Nutzer eine Page erzeugt und daran Dokumente anhängen kann.

Die Page besteht aus einem Content-Editor-Webpart und einem gefilterten View auf eine DocumentLibrary.

Der Filter filtert anhand eines MetaTags die zur Page gehörenden Anhänge heraus.

Um dem Nutzer die Möglichkeit eines Mehrfach-Uploads zugeben, wurde eine Form programmiert, welche folgende Funktionen beeinhaltet:

- Auswahl von lokalen Dokumenten, welche in einer Liste gespeichert werden

- Auswahl der Page, welche die Anhänge enthalten soll

- Upload aller ausgewählten Dokumente in die DocLib unter Hinzufügen des Metatags

Beim Löschen einer Page (z.B. AP1) aus der Pages-Library sollen ebenso die Dokumente mit dem MetaTag (z.B. AP1) aus der DocLib gelöscht werden.

Anhängen, Upload und Speichern funktionierten prima, auch kann die Page gelöscht werden. Das MetaTag wird auch nicht mehr angezeigt, da es in einem LookupFeld gespeichert ist, welches auf die Liste der Pages zielt.

Das Feature ist mit seiner GUID in der ONET unter jeder erzeugten Site eingetragen <Configurations> - <Configuration ...> - <SiteFeatures> ....

 

Aufbau des Projektes (Focus auf das Feature)

 

Solution

+--- C:\Users\[...]\Documents\Visual Studio 2008\Projects\MOSS\[Gesamt].root\[SolutionName]\[SolutionName]\12\TEMPLATE\LAYOUTS\[..]\SharePlace

    +--- WebControls

         +--- AddAttachmentPage.ascx

              +--- AddAttachmentPage.ascx.cs

         +--- MultipleUploadForm.ascx

              +--- MultipleUploadForm.ascx.cs

+---[Projekt]

    +--- 12

         +--- Template

              +--- FEATURES

                   +--- AttachmentPage

                        +--- PageLayouts

                             +--- AttachmentPage.aspx

                        +--- elements.xml

                        +--- feature.xml

    +--- FeatureCode

         +--- AttachmentPage.cs

         +--- AttachmentPageEventReceiver.cs

         +--- AttachmentPageEventReceiverDoc.cs

 

Code-Auszug AttachmentPage.cs:

 

using System;

using System.Collections.Generic;

using System.Text;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Navigation;

 

namespace [Projekt]

class AttachmentPage : SPFeatureReceiver

    {public override void FeatureActivated(SPFeatureReceiverProperties properties)

        {

            string assembly = "solution, Version=1.0.0.0, Culture=neutral, PublicKeyToken=64f6d54d1d6e09cd";

            string classNamePages = "[Projekt].Events.AttachmentPage";

            string classNameDocs = "[Projekt].Events.AttachmentPageDoc";

            string featureName = "AttachmentPage";

           

            SPWeb web = (SPWeb)properties.Feature.Parent;

            

            SPList pages = web.Lists["Pages"];

            if (pages != null)

            {

                SPContentType parent = web.AvailableContentTypes["Document"];

                SPContentType newCT = new SPContentType(parent, pages.ContentTypes, featureName);

              

                // new Content Type (CT)

                newCT.NewFormTemplateName = featureName;

                newCT.NewFormUrl = "_catalogs/masterpage/attachmentpage.aspx";

                pages.ContentTypes.Add(newCT);

                newCT.Update();

              

                //Event receivers for Pages Lib

                pages.EventReceivers.Add(SPEventReceiverType.ItemAdded, assembly, classNamePages);

                pages.EventReceivers.Add(SPEventReceiverType.ItemDeleted, assembly, classNamePages);

                pages.EventReceivers.Add(SPEventReceiverType.ItemAdding, assembly, classNamePages);

                pages.EventReceivers.Add(SPEventReceiverType.ItemDeleting, assembly, classNamePages);

 

                pages.Update();

            }

            SPList docs = web.Lists["Documents"];

            if (docs != null)

            {

                //add lookup Field for DocLib

                docs.Fields.AddLookup(featureName, pages.ID, false);

                docs.Update();

                SPView defView1 = docs.DefaultView;

                SPFieldLookup lookup = ((SPFieldLookup)docs.Fields[featureName]);

                //get referenced field

                lookup.Required = false;

                lookup.AllowMultipleValues = false;

                lookup.LookupField = "Title";

 

                defView1.ViewFields.Add(docs.Fields[featureName]);

                defView1.Update();

                lookup.Update();

 

                //event receivers for Doc Lib

                docs.EventReceivers.Add(SPEventReceiverType.ItemAdded, assembly, classNameDocs);

                docs.EventReceivers.Add(SPEventReceiverType.ItemAdding, assembly, classNameDocs);

               

                docs.Update();

            }

        }

 

Code Auszug AttachmentPageEventReceiver.cs:

 

using System;

using System.Security.Permissions;

using System.Runtime.InteropServices;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Security;

using System.Collections.Generic;

using System.Collections;

using System.Text;

using System.Collections.Specialized;

 

namespace [Projekt].Events

{

    /// <summary>

    /// Pages Event Receiver. Contains event handler methods for deleting a page.

    /// </summary>

    public class AttachmentPage : SPItemEventReceiver

    {

[SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]

        public override void ItemDeleting(SPItemEventProperties properties)

        {

            string AttachmentPageName = "";

            //delete files attached to AP

            using (SPWeb web = properties.OpenWeb())

            {

                SPList docs = web.Lists["Documents"];

                if (docs != null)

                {

                    foreach (SPListItem item in docs.Items)

                    {

                        if (item["AttachmentPage"].ToString() + ".aspx" == properties.ListItem["Name"].ToString())

                        {

                            item.Recycle();

                            AttachmentPageName = item["AttachmentPage"].ToString();

                        }

                    }

 

                    //delete the AP specific view                   

                    foreach (SPView view in docs.Views)

                    {

                        if (view.Title == "AttachmentPageView" + AttachmentPageName)

                        {

                            docs.Views.Delete(view.ID);

                        }

                    }

 

                }

            }

        }

 

Das Projekt erzeugt eine SiteStruktur samt Berechtigungen und fügt einige Features hinzu. Der WSPBuilder übernimmt das Build, Deployment und Installation werden mittels stsadm abgewickelt.

 

Nachdem ich mir nun die Finger wund gesucht habe, hier nun die Frage an die Community: hat jemand eine Idee, woran es liegen könnte.

Laut dem ursprünglichen Entwickler und aller Fundstellen im Web sollte es so funktionieren.

 

mfg

 

Michael Richter

Alle Antworten

Ohne Rang
2 Beiträge
Michael Richter Als Antwort am 30 Juni 2009 13:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok. Es war natürlich etwas gaaanz einfaches. Denn: die Rahmenbedingungen hatten sich geändert.

 if (item["AttachmentPage"].ToString() + ".aspx" == properties.ListItem["Name"].ToString())

erwartet natürlich links und rechts vom = Strings. Nun ist baer links davon ein String-Array. Warum dies? Das so abgefragte Feld war eins ein Freitext-Feld, nun aber ist es ein Lookup-Feld. Und so konnte das nur schiefgehen.

Der volle Code sieht nun so aus:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

public override void ItemDeleting(SPItemEventProperties properties)

{

 

 

string AttachmentPageName = "";

 

 

//delete files attached to AP

 

 

using (SPWeb web = properties.OpenWeb())

{

 

 

SPList docs = web.Lists["Documents"];

 

 

 

 

if (docs != null)

{

 

 

List<string> itemsToDelete = new List<string>();

 

 

 

 

foreach (SPListItem item in docs.Items)

 

 

{

 

 

if (item["AttachmentPage"].ToString().Split('#')[1] + ".aspx" == properties.ListItem["Name"].ToString())

{

 

 

 

 

itemsToDelete.Add(item.ID.ToString());

 

 

 

 

 

 

AttachmentPageName = item[

"AttachmentPage"].ToString().Split('#')[1];

}

}

 

 

foreach (String id in itemsToDelete)

{

 

 

Int32 Out = 0;

 

 

bool result = Int32.TryParse(id, out Out);

 

 

if (result)

{

 

 

SPListItem item = docs.Items.GetItemById(Int32.Parse(id));

 

 

//delete item (move to recycle bin)

item.Recycle();

 

 

docs.Update();

}

}

 

 

//delete the AP specific view

 

 

foreach (SPView view in docs.Views)

{

 

 

if (view.Title == "AttachmentPageView" + AttachmentPageName)

{

docs.Views.Delete(view.ID);

 

 

break;

}

}

}

}

}

Bitte beachten: Lösche niemals Items aus einer Liste innerhalb einer for...each-Schleife, das führt definitv zu Fehlern ;-)

Und der View musste natürlich ebenfalls entfernt werden.

Kleiner Tipp am Rande:

Wer zuverlässig debuggen will, sollte in Zusammenarbeit mit dem WSPBuilder Attach to IIS Worker Processes benutzen. Dabei darf man aber getrost sehr konservativ vorgehen: Solution builden, WSP builden, iisreset /restart, WSP deployen und dann installieren. Und dass möglichst immer vor dem Debuggen, anderenfalls *kann* es dazu kommen, dass es nix zu debuggen gibt ...

mfg

Michael