Как я могу добавить получатель событий только для списка с конкретным идентификатором шаблона - PullRequest
7 голосов
/ 25 октября 2010

Я добавляю приемник событий ItemAdding для настраиваемого шаблона списка. И получатель события, и шаблон списка развернуты одной и той же функцией. Также та же функция создает экземпляры списка.

У меня проблема в том, что событие запускается для каждого элемента списка на сайте, на котором оно было развернуто. Elements.xml для 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>

Я не уверен, что я делаю неправильно, я сделал более или менее все, начиная с здесь .

Env: Sharepoint 2010 с функцией публикации на этом сайте

Ответы [ 4 ]

13 голосов
/ 20 сентября 2011

У меня была такая же проблема с моим Event Receiver. Я пробовал ListTemplateId, ListTemplateOwner и даже ListUrl. Я знал, что настройки действительны, но они игнорировались, и получатель прикреплялся к каждому списку.

Я догадывался, что это может быть связано с объявлением приемника событий в рамках функции области сайта. Это подтверждается "документацией" для 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;
        }
      }
  }

Похоже, что ListTemplateId, ListTemplateOwner и ListUrl игнорируются для функций области сайта. Когда я переместил свой элемент Event Receiver в функцию веб-области, получатель был правильно подключен только к нужному списку.

3 голосов
/ 14 сентября 2011

При просмотре до site он запускается для всех списков. Когда я определил область действия web , это сработало. Надеюсь, это поможет.

2 голосов
/ 25 октября 2010

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


Тег Receivers может подразумевать регистрацию событий в масштабах всего сайта или регистрацию событий для корневого Интернета.Атрибут Scope используется для определения того, на каком уровне применяются приемники событий.Если тег Receivers не имеет атрибута ListTemplateId или ListUrl, получатель события регистрируется в той же области действия, что и объект.Например, функция, находящаяся в области видимости в Интернете, приводит к тому, что получатель событий добавляется в коллекцию приемников событий, которая попадает в область действия.


Это заставляет меня поверить, что списокПредоставленный вами идентификатор шаблона может быть недействительным.

1 голос
/ 06 декабря 2012

Если вам нужна слишком широкая область действия получателя событий только для определенного списка, вы должны установить этот атрибут, и он будет работать ISA, но убедитесь, что ваша функция имеет веб-область, а не область, как если бы это была область сайта, она будет запускаться для всех списковсистема

...