7

Sto aggiungendo il ricevitore di eventi ItemAdding per il modello di elenco personalizzato. Sia il ricevitore eventi che il modello elenco vengono distribuiti con la stessa funzione. Anche la stessa funzione crea istanze di lista.Come posso aggiungere il ricevitore di eventi solo per la lista con modello specyfic id

Il problema che ho riscontrato è che l'evento è attivato per ciascuna voce di elenco nel sito a cui è stato distribuito. Elements.xml per eventreceivre è:

<Receivers ListTemplateId="10200"> 
    <Receiver> 
    <Name>ListEventReceiverItemAdding</Name> 
    <Type>ItemAdding</Type> 
    <Assembly>$SharePoint.Project.AssemblyFullName$</Assembly> 
    <Class>SharepoitProject.ListEventReceiver</Class> 
    <SequenceNumber>10000</SequenceNumber> 
    </Receiver> 
</Receivers> 

io non sono sicuro di quello che sto facendo di sbagliato che ho fatto più o meno everythin da here.

Env: Sharepoint 2010 con funzionalità di pubblicazione su questo sito

+0

Vuoi dire che viene attivato per ogni voce di elenco per ogni elenco? –

+0

Voglio dire che quando qualche elemento viene aggiunto ad alcune liste sul sito (non necessariamente lista creata da temlate 10200) l'evento viene attivato. –

+0

Strano, sembra che tu abbia fatto bene .. Prova ad attivare la funzione su una nuova raccolta di siti. Solo per assicurarsi che non fosse allegato a tutte le liste durante lo sviluppo. –

risposta

13

Ho avuto lo stesso problema con il mio ricevitore di eventi. Ho provato ListTemplateId, ListTemplateOwner e persino ListUrl. Sapevo che le impostazioni erano valide, ma venivano ignorate e il ricevitore veniva allegato a ogni elenco.

Ho avuto l'impressione che potrebbe essere correlato al Destinatario evento dichiarato all'interno di una funzione con ambito sito. Ciò sembra essere confermato dal "documentation" per SPEventElement:

switch (this.FeatureDefinition.Scope) 
    { 
    case SPFeatureScope.Site: 
     if (this.SiteScopedReceivers()) 
     { 
     this.UpdateEventReceiversForSite(site, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForSite(this.GetEventReceivers(site.RootWeb).GetSqlToAddEventReceiversToSite)); 
     break; 
     } 
     else 
     { 
     this.UpdateEventReceiversForWeb(site.RootWeb, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForWeb(this.GetEventReceivers(site.RootWeb).GetSqlToAddEventReceiversToWeb)); 
     break; 
     } 
    case SPFeatureScope.Web: 
     if (this.RootWebOnly && !web.IsRootWeb) 
     { 
     ULS.SendTraceTag(1718513714U, (ULSCatBase) ULSCat.msoulscat_WSS_General, ULSTraceLevel.Verbose, "Event Receivers in Feature '{0}' were not activated because current web is not the root web.", new object[1] 
     { 
      (object) this.FeatureDefinition.Id.ToString("B") 
     }); 
     break; 
     } 
     else 
     { 
     bool templateIdExists; 
     int templateId; 
     this.CheckTemplateId(out templateIdExists, out templateId); 
     if (!templateIdExists) 
     { 
      if (this.ListUrl != null) 
      { 
      this.UpdateEventReceiversForList(web, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForList(this.GetEventReceivers(web).GetSqlToAddEventReceiversToList), true); 
      break; 
      } 
      else 
      { 
      this.UpdateEventReceiversForWeb(web, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForWeb(this.GetEventReceivers(web).GetSqlToAddEventReceiversToWeb)); 
      break; 
      } 
     } 
     else 
     { 
      if (this.ListUrl != null) 
      throw new SPException(SPResource.GetString("ElementHasBothTemplateIdAndUrl", new object[0])); 
      this.UpdateEventReceiversForListTemplate(templateId, web, sqlcmdAppendOnly, new SPEventElement.GetSqlToUpdateEventReceiversForList(this.GetEventReceivers(web).GetSqlToAddEventReceiversToList)); 
      break; 
     } 
     } 
    } 

Sembra che ListTemplateId, ListTemplateOwner e ListaURL vengono ignorati per il sito ambito caratteristiche. Quando ho spostato l'elemento Ricevitore di eventi in una funzione con ambito Web, il ricevitore è stato collegato correttamente solo all'elenco desiderato.

+0

ambito web il ricevitore dell'evento. simpatico! –

2

da MSDN SDK - http://msdn.microsoft.com/en-us/library/ms431081.aspx


tag

Un Ricevitori può implicare un sito a livello di registrazione evento o una registrazione evento per il Web principale. L'attributo Scope viene utilizzato per definire a a quale livello sono applicati i ricevitori di eventi . Se il tag Receivers non ha l'attributo ListTemplateId o ListUrl, , il destinatario dell'evento è registrato allo nello stesso ambito della funzione. Per esempio , una funzionalità con ambito a il Web genera un ricevitore di eventi aggiunto a una raccolta di eventi ricevitore con ambito per il Web.


Questo mi porta a credere che la lista templateId hai fornito potrebbe non essere valido.

3

Quando è stato impostato su , il sito è stato attivato per tutte le liste. Quando ho individuato la soluzione su web, ha funzionato. Spero che sia d'aiuto.

1

Se avete bisogno di troppo la portata del ricevitore evento per lista specifica solo è necessario impostare questo attributo e funzionerà ISA ma fare in modo che la vostra caratteristica è web ambito non luogo ambito come se fosse portata sito che verrà generato per tutti gli elenchi nel sistema

+2

mostra all'OP il codice – dove

Problemi correlati