7

我正在爲自定義列表模板添加ItemAdding事件接收器。事件接收器和列表模板都由相同的功能部署。同樣的功能也會創建列表實例。如何添加事件接收器僅用於specyfic模板ID

我得到的問題是,該事件是在其部署到的站點中的每個列表項目被解僱。 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> 

我不知道我在做什麼錯了,我已經從here做得更多或更少的everythin。

ENV:SharePoint 2010的與本網站

+0

您的意思是每個列表的每個列表項目都被解僱了嗎? – 2010-10-25 13:41:12

+0

我的意思是,當一些項目被添加到網站上的某個列表(不一定是從temlate 10200創建的列表)時,事件被觸發。 – 2010-10-25 13:53:29

+0

奇怪,聽起來像你做對了..嘗試激活一個全新的網站集功能。只是爲了確保它在開發過程中並不依賴於所有列表。 – 2010-10-25 14:10:43

回答

13

我和我的Event Receiver有同樣的問題。我嘗試了ListTemplateId,ListTemplateOwner,甚至ListUrl。我知道這些設置是有效的,但是他們被忽略了,並且接收器被連接到每個列表。

我有一個預感,它可能與在Site範圍功能中聲明的Event Receiver有關。這似乎是由"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作用域功能時,接收器只能正確連接到所需列表。

+0

web作用域事件接收器。太好了! – 2012-06-16 15:56:24

2

從MSDN SDK的發佈功能 - http://msdn.microsoft.com/en-us/library/ms431081.aspx


一個接收器標籤可能意味着整個網站的 事件註冊或事件 註冊爲根網站。 範圍屬性用於定義在 事件接收器應用了什麼級別 。如果接收者標記沒有 ListTemplateId或ListUrl屬性 ,則事件接收者在 處註冊的範圍與該功能的範圍相同。例如,對於 示例,Web的範圍爲 的功能導致將事件接收方 添加到作用域爲Web的事件接收方 集合中。


這使我相信你提供的列表templateID可能是無效的。

3

當範圍爲網站它爲所有列表啓動。當我的解決方案的範圍網絡它的工作。希望能幫助到你。

1

如果您需要太多餘地特定列表事件接收器只有你必須設置該屬性 ,也將努力ISA 但要確保你的特點是網絡範圍的不是網站範圍的,如果是站點範圍將火系統中的所有列表

+2

顯示OP的代碼 – dove 2012-12-06 15:06:11

相關問題