2010-03-17 4 views
2

J'ai créé un nouveau type de contenu pour une bibliothèque de pages wiki. J'ai ajouté ce type de contenu à la bibliothèque par code (l'interface ne le permettait pas). Ensuite, j'ai ajouté un récepteur d'événements à ce type de contenu (sur ItemAdded et ItemAdding). Mon problème est qu'aucun événement n'est trrigré. Si j'ajoute directement ces événements à la bibliothèque de pages wiki, tout fonctionne correctement. Existe-t-il une limitation/bug/astuce?Récepteur d'événement sur Type de contenu non déclenché sur WikiPageLibrary

J'ai regardé le type de contenu attaché à la bibliothèque SharePoint Manager et dans son schéma de la partie pour récepteur d'événements manque ... Je sais qu'il devrait y avoir quelque chose comme:

<XmlDocuments> 
    <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/events"> 
     <spe:Receivers xmlns:spe="http://schemas.microsoft.com/sharepoint/events"> 
     <Receiver> 
      <Name> 
      </Name> 
      <Type>1</Type> 
      <SequenceNumber>10000</SequenceNumber> 
      <Assembly>RssFeedWP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f6722cbeba696def</Assembly> 
      <Class>RssFeedWP.ItemEventReceiver</Class> 
      <Data> 
      </Data> 
      <Filter> 
      </Filter> 
     </Receiver> 
     <Receiver> 
      <Name> 
      </Name> 
      <Type>10001</Type> 
      <SequenceNumber>10000</SequenceNumber> 
      <Assembly>RssFeedWP, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f6722cbeba696def</Assembly> 
      <Class>RssFeedWP.ItemEventReceiver</Class> 
      <Data> 
      </Data> 
      <Filter> 
      </Filter> 
     </Receiver> 
     </spe:Receivers> 
    </XmlDocument> 

Si je regarde avec SPM au type de contenu ajouté au site, je vois cette partie dans le schéma.

Voici mon code:

public override void FeatureActivated(SPFeatureReceiverProperties properties) 
    { 
     using (SPWeb web = (SPWeb)properties.Feature.Parent) 
     { 
      // create RssWiki content type 
      SPContentType rssFeedContentType = new SPContentType(web.AvailableContentTypes["Wiki Page"], 
               web.ContentTypes, "RssFeed Wiki Page"); 

      // add rssfeed url field to the new content type 
      AddFieldToContentType(web, rssFeedContentType, "RssFeed Url", SPFieldType.Note);     
      // add use xslt check box field to the new content type 
      AddFieldToContentType(web, rssFeedContentType, "Use Xslt", SPFieldType.Boolean);     
      // add xslt url field to the new content type 
      AddFieldToContentType(web, rssFeedContentType, "Xslt Url", SPFieldType.Note); 

      web.ContentTypes.Add(rssFeedContentType); 
      rssFeedContentType.Update(); 
      web.Update(); 

      AddContentTypeToList(web, rssFeedContentType); 
      AddEventReceiversToCT(rssFeedContentType); 
      //AddEventReceiverToList(web); 
     } 
    } 

    private void AddFieldToContentType(SPWeb web, SPContentType ct, string fieldName, SPFieldType fieldType) 
    {    
     SPField rssUrlField = null; 
     try 
     { 
      rssUrlField = web.Fields.GetField(fieldName); 
     } 
     catch (Exception ex) 
     { 
      if (rssUrlField == null) 
      { 
       web.Fields.Add(fieldName, fieldType, false); 
      } 
     } 
     SPFieldLink rssUrlFieldLink = new SPFieldLink(web.Fields[fieldName]); 
     ct.FieldLinks.Add(rssUrlFieldLink); 
    } 

    private static void AddContentTypeToList(SPWeb web, SPContentType ct) 
    { 
     SPList wikiList = web.Lists[listName]; 
     wikiList.ContentTypesEnabled = true; 
     wikiList.ContentTypes.Add(ct); 
     wikiList.Update(); 
    } 

    private static void AddEventReceiversToCT(SPContentType ct) 
    { 
     //add event receivers     
     string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().FullName; 
     string ctReceiverName = "RssFeedWP.ItemEventReceiver"; 

     ct.EventReceivers.Add(SPEventReceiverType.ItemAdding, assemblyName, ctReceiverName); 
     ct.EventReceivers.Add(SPEventReceiverType.ItemAdded, assemblyName, ctReceiverName); 
     ct.Update(); 
    } 

Thx!

Répondre

5

Je ne suis pas sûr, mais pourriez-vous essayer d'ajouter le récepteur d'événements au type de contenu avant d'ajouter le type de contenu à la liste.

Je pense que le récepteur d'événements doit être ajouté auparavant car lorsque vous ajoutez un type de contenu à une liste, le type de contenu n'est pas ajouté directement à la liste, mais une copie est ajoutée à la liste. Ainsi, lorsque vous ajoutez votre type de contenu à la liste, il n'y a pas encore de récepteur d'événements.

+0

J'ai travaillé !!! Big thx! –

Questions connexes