Pergunta

Estou adicionando ItemAdding Event Receiver para o modelo de lista personalizado. O receptor de eventos e o modelo de lista são implantados pelo mesmo recurso. Além disso, o mesmo recurso cria instâncias da lista.

O problema que tenho é que o evento é disparado para cada item da lista no local para o qual foi implantado. Elements.xml para 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>

Não tenho certeza do que estou fazendo de errado, fiz mais ou menos tudo de tudo de aqui.

Env: SharePoint 2010 com o recurso de publicação neste site

Foi útil?

Solução

Eu tive o mesmo problema com meu receptor de evento. Eu tentei ListTemplateId, ListTemplateOwner e até Listurl. Eu sabia que as configurações eram válidas, mas elas estavam sendo ignoradas e o receptor estava sendo anexado a todas as listas.

Eu tinha um palpite de que ele poderia estar relacionado ao receptor do evento que está sendo declarado dentro de um recurso escopo. Isso parece ser confirmado pelo "documentação" Para 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;
        }
      }
  }

Parece que ListTemplateId, ListTemPlateOwner e Listurl são ignorados para os recursos escoposos do site. Quando movi meu elemento receptor de evento para um recurso escopo da Web, o receptor foi anexado corretamente apenas à lista desejada.

Outras dicas

Quando escopo local Ele disparou para todas as listas. Quando eu procurei a solução para rede funcionou. Espero que ajude.

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


Uma tag de receptores pode sugerir um registro de eventos em todo o site ou um registro de evento para a Web Root. O atributo de escopo é usado para definir em que nível os receptores de eventos são aplicados. Se a tag Receptores não tiver um atributo ListTemplateId ou Listurl, o receptor de eventos será registrado no mesmo escopo do recurso. Por exemplo, um recurso que é escopo para a Web resulta em um receptor de evento sendo adicionado a uma coleção de receptores de eventos que é escopo na Web.


Isso me leva a acreditar que o modelo da lista que você forneceu pode ser inválido.

Se você precisar de escopo também o receptor de eventos para uma lista específica, você deve definir esse atributo e funcionará ISA, mas verifique se o seu recurso está escopo e não escopo do site como se fosse o escopo do site, ele disparará para todas as listas no sistema

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top