7

我正在为自定义列表模板添加 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>

我不确定我做错了什么我从这里或多或少地做了一切。

环境:Sharepoint 2010 在此站点上具有发布功能

4

4 回答 4

13

我的事件接收器也有同样的问题。我尝试了 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。当我将事件接收器元素移动到 Web 范围的功能时,接收器仅正确附加到所需的列表。

于 2011-09-20T17:15:27.457 回答
3

当范围限定为站点时,它会针对所有列表触发。当我将解决方案范围限定为网络时,它起作用了。希望能帮助到你。

于 2011-09-14T13:35:11.770 回答
2

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


Receivers 标签可以暗示站点范围的事件注册或根 Web 的事件注册。Scope 属性用于定义应用事件接收器的级别。如果 Receivers 标签没有 ListTemplateId 或 ListUrl 属性,则事件接收器注册在与 Feature 相同的范围内。例如,限定为 Web 的功能会导致将事件接收器添加到限定为 Web 的事件接收器集合中。


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

于 2010-10-25T16:53:02.480 回答
1

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

于 2012-12-06T14:47:08.943 回答