如何仅为具有特定模板 ID 的列表添加事件接收器 [英] how can I add event receiver only for list with specyfic template id

查看:30
本文介绍了如何仅为具有特定模板 ID 的列表添加事件接收器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm adding ItemAdding event receiver for custom list template. Both event receiver and list template are deployed by the same feature. Also the same feature creates List Instances.

我遇到的问题是该事件在部署到的站点中为每个列表项触发.事件接收的 Elements.xml 是:

The problem I've got is that the event is fired for each list item in site to which it was deployed. Elements.xml for eventreceivre is:

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

我不确定我做错了什么我或多或少都做了此处.

I'm not sure what I'm doing wrong I've done more or less everythin from here.

Env:Sharepoint 2010,在此站点上具有发布功能

Env: Sharepoint 2010 with Publishing Feature on this Site

推荐答案

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

I had the same problem with my Event Receiver. I tried ListTemplateId, ListTemplateOwner, and even ListUrl. I knew the settings were valid, but they were being ignored and the receiver was being attached to every list.

我有一种预感,它可能与在站点范围功能中声明的事件接收器有关.SPEventElement 的文档"似乎证实了这一点:

I had a hunch that it might be related to the Event Receiver being declared within a Site scoped feature. This seems to be confirmed by the "documentation" for 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 范围内的功能时,接收器仅正确附加到所需列表.

It appears that ListTemplateId, ListTemplateOwner, and ListUrl are ignored for Site scoped features. When I moved my Event Receiver element to a Web scoped feature, the receiver was properly attached only to the desired list.

这篇关于如何仅为具有特定模板 ID 的列表添加事件接收器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆