如何仅为具有特定模板ID的列表添加事件接收器

时间:2010-10-25 11:17:10

标签: sharepoint sharepoint-2010 eventreceiver sharepoint-listtemplate

我正在为自定义列表模板添加ItemAdding事件接收器。事件接收器和列表模板都由相同的功能部署。同样的功能也会创建列表实例。

我遇到的问题是,在部署它的站点中,每个列表项都被触发。 eventreceivre的Elements.xml是:

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

我不确定我做错了什么我从here开始或多或少地做了什么。

环境:Sharepoint 2010与本网站上的发布功能

4 个答案:

答案 0 :(得分:13)

我的事件接收器遇到了同样的问题。我尝试过ListTemplateId,ListTemplateOwner,甚至是ListUrl。我知道这些设置是有效的,但它们被忽略了,接收器被附加到每个列表中。

我预感到它可能与在Site scoped功能中声明的Event Receiver有关。这似乎由SPEventElement的"documentation"确认:

  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元素移动到Web范围的功能时,接收器只能正确连接到所需的列表。

答案 1 :(得分:3)

当范围限定为网站时,会针对所有列表触发。当我将解决方案范围扩展到 web 时,它就可以了。希望它有所帮助。

答案 2 :(得分:2)

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


  

Receivers标签可能意味着网站范围内   活动登记或活动   注册根网站。该   Scope属性用于定义at   事件接收器的级别   应用。如果Receivers标签没有   ListTemplateId或ListUrl属性,   事件接收者在   与功能相同的范围。对于   示例,作用域的功能   Web导致事件接收器   被添加到事件接收器   范围为Web的集合。


这让我相信您提供的列表模板ID可能无效。

答案 3 :(得分:1)

如果您只需要特定列表的事件接收器作用域,则必须设置此属性 它将工作ISA 但请确保您的功能是网络范围而非网站范围,就好像它的网站范围一样,它将为系统中的所有列表触发