comment puis-je ajouter récepteur d'événements uniquement pour la liste avec l'identifiant de modèle spécifique

StackOverflow https://stackoverflow.com/questions/4014020

Question

J'ajoute le récepteur d'événements ItemAdding pour le modèle de liste personnalisée. Les deux récepteur d'événements et le modèle de liste sont déployés par la même fonction. Aussi la même fonction crée des instances de la liste.

Le problème que j'ai est que l'événement est a tiré pour chaque élément de la liste dans le site auquel il a été déployé. Elements.xml pour eventreceivre est:

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

Je ne sais pas ce que je fais mal, je l'ai fait plus ou moins everythin ici .

Env: 2010 Sharepoint avec la publication Feature sur ce site

Était-ce utile?

La solution

J'ai eu le même problème avec mon récepteur d'événements. J'ai essayé ListTemplateId, ListTemplateOwner, et même ListUrl. Je savais que les paramètres étaient valides, mais ils ont été ignorés et le récepteur était d'être attaché à chaque liste.

J'ai eu le pressentiment qu'il pourrait être lié au récepteur de l'événement étant déclaré dans un scope fonction du site. Cela semble être confirmé par le "documentation" 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;
        }
      }
  }

Il semble que ListTemplateId, ListTemplateOwner et ListUrl sont ignorés pour les fonctionnalités étendues du site. Lorsque je me suis déplacé mon élément récepteur d'événements à une fonction scope Web, le récepteur a été correctement fixé uniquement à la liste désirée.

Autres conseils

Quand scope sur le site il a tiré pour toutes les listes. Quand je scoped la solution à Web il a travaillé. Espérons que cela aide.

Dans le MSDN SDK - http://msdn.microsoft.com/en -nous / bibliothèque / ms431081.aspx


  

Une balise récepteurs peut impliquer un ensemble du site   l'enregistrement d'événement ou d'un événement   inscription pour le Web racine. le   Champ d'application de l'attribut est utilisé pour définir au   quel niveau les récepteurs d'événements sont   appliqué. Si la balise Récepteurs n'a pas   ListTemplateId ou attribut ListUrl,   le récepteur d'événements est enregistré à   la même portée que la fonction. Pour   par exemple, une fonctionnalité qui est scope à   les Résultats sur le Web dans un récepteur d'événements   étant ajoutée à un récepteur d'événements   collection qui est portée a été définie sur le Web.


Cela me conduit à croire que la liste templateId que vous avez fourni peut être invalide.

Si vous avez besoin trop la portée du récepteur d'événements pour une liste spécifique que vous devez définir cet attribut et il fonctionnera ISA mais assurez-vous que votre fonction est web scope pas le site scope comme si elle est portée de site, il se déclenche pour toutes les listes dans le système

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top