¿Cómo puedo agregar un receptor de eventos solo para la lista con una identificación de plantilla específica?

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

Pregunta

Estoy agregando el receptor de eventos ItemAdding para una plantilla de lista personalizada.Tanto el receptor de eventos como la plantilla de lista se implementan mediante la misma característica.Además, la misma función crea instancias de lista.

El problema que tengo es que el evento es disparado para cada elemento de la lista en el sitio donde fue desplegado.Elements.xml para eventreceivre es:

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

No estoy seguro de qué estoy haciendo mal. He hecho más o menos de todo desde aquí.

Sobre:Sharepoint 2010 con función de publicación en este sitio

¿Fue útil?

Solución

Yo tenía el mismo problema con mi receptor de eventos. Probé ListTemplateId, ListTemplateOwner, e incluso ListadoURL. Yo sabía que los ajustes eran válidas, pero estaban siendo ignorado y el receptor estaba siendo adjuntado a cada lista.

Yo tenía el presentimiento de que podría estar relacionado con el receptor de eventos de ser declarado dentro de un sitio característica con ámbito. Esto parece confirmarse por el "documentación" 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 y ListadoURL se ignoran para Sitio de ámbito características. Cuando me mudé mi elemento receptor de eventos a una característica Web de ámbito, el receptor fue correctamente sólo une a la lista deseada.

Otros consejos

Cuando con ámbito a sitio se disparó en todas las listas. Cuando fui a verla la solución a web funcionó. Espero que ayuda.

Desde el SDK de MSDN - http://msdn.microsoft.com/en -us / biblioteca / ms431081.aspx


  

tag receptores de A puede implicar un sitio de gran   registro de eventos o un evento   inscripción para la Web raíz. los   atributo scope se utiliza para definir en   ¿Qué nivel de los receptores de eventos son   aplicado. Si la etiqueta no tiene Receptores   ListTemplateId o atributo ListadoURL,   el receptor de eventos se ha registrado en   el mismo alcance que la función. por   ejemplo, una característica que tiene como alcance   los resultados web en un receptor de eventos   de ser añadido a un receptor de eventos   colección que tiene como alcance la web.


Esto me lleva a creer que la lista templateId que ha proporcionado puede ser válido.

Si necesita demasiado el alcance del receptor de eventos para la lista específica sólo se debe establecer este atributo y funcionará ISA pero asegúrese de que su función es la web no con ámbito de ámbito sitio como si de ámbito de sitio que se activará para todas las listas en el sistema

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top