Как добавить получатель событий только для списка с указанным идентификатором шаблона

Я добавляю получатель события 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 ответа

Решение

У меня была такая же проблема с моим приемником событий. Я пробовал 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 в функцию веб-области, получатель был правильно подключен только к нужному списку.

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

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


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


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

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

Другие вопросы по тегам