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

标签 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 与此站点上的发布功能

最佳答案

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

我有一种预感,它可能与在站点范围功能中声明的事件接收器有关。这似乎得到了"documentation"的证实。对于 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 元素移动到 Web 范围内的功能时,接收器仅正确附加到所需列表。

关于sharepoint - 如何仅为具有特定模板 ID 的列表添加事件接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014020/

相关文章:

"Stop Inheriting Permissions"功能的 SharePoint 2013 事件接收器

javascript - 使用 Visual Studio IDE 在 SharePoint 中进行 JavaScript 开发 - 文件自动重命名为 MyFile.js~RFxxxxx.TMP

powershell - 在安装 Sharepoint 2010 之前卸载 PowerShell 1.0

从中创建新列表时,不会显示 SharePoint 导入的列表模板

mysql - 在 SharePoint 中保存 SQL 查询

asp.net - sharepoint wiki 页面中的可编辑标题栏

sharepoint - 维基页面库上未触发内容类型的事件接收器

sharepoint - 如何在创建 SharePoint 列表时触发代码?

web-services - SharePoint List.getListItems Web服务以递归方式返回子文件夹的内容