特定のテンプレート ID を持つリストにのみイベント レシーバーを追加するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/4014020

質問

カスタムリストテンプレートに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

役に立ちましたか?

解決

私は私のイベントレシーバーと同じ問題を抱えていました。私は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が無視されることが表示されます。私はウェブスコープ機能に私のイベントレシーバー要素を移動すると、受信機が正しく希望リストにのみ取り付けた。

他のヒント

スコープへのサイトのそれはすべてのリストのために解雇しました。私はウェブへのソリューションをスコープと、それは働きました。それが役に立てば幸います。

MSDN SDKから

- http://msdn.microsoft.com/en -us /ライブラリ/ ms431081.aspxする

<時間>
  

Aレシーバタグは、サイト全体を意味することができます   イベント登録またはイベント   ルートWebの登録。ザ・   scope属性は、で定義するのに使用されます   イベントレシーバーは何レベル   適用されます。レシーバタグはありません持っている場合   ListTemplateIdまたはListUrl属性、   で登録されている受信機のイベント   フィーチャーと同じスコープ。ために   たとえば、にスコープされた機能   イベントレシーバでウェブ検索結果   イベント受信に追加されます   ウェブにスコープされるコレクションます。

<時間>

このリード私はリストには、無効である可能性が提供されるtemplateIdと信じています。

あなたもスコープ、特定のリストのためのイベントレシーバーのみが必要な場合は、

あなたは、この属性を設定する必要があります それが動作しますISA しかし、必ずあなたの機能は、ウェブがないスコープ、サイトスコープであることを確認、それのサイトスコープは、それがシステム内のすべてのリストのために発生しますかのように

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top