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

サイトをスコープすると、すべてのリストに対して発生しました。ソリューションのスコープをWebにすると、うまくいきました。それが役に立てば幸い。

于 2011-09-14T13:35:11.770 に答える
2

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


Receivers タグは、サイト全体のイベント登録またはルート Web のイベント登録を意味する場合があります。Scope 属性は、イベント レシーバーが適用されるレベルを定義するために使用されます。Receivers タグに ListTemplateId または ListUrl 属性がない場合、イベント レシーバーはフィーチャーと同じスコープで登録されます。たとえば、Web をスコープとするフィーチャーは、Web をスコープとするイベント レシーバー コレクションにイベント レシーバーを追加します。


これにより、指定したリストの templateID が無効であると思われます。

于 2010-10-25T16:53:02.480 に答える
1

特定のリストに対してのみイベントレシーバーのスコープが必要な場合は、この属性を設定する必要があります。これはISAで機能しますが、サイトスコープではなくWebスコープであることを確認してください。これは、システム内のすべてのリストに対して起動されます。

于 2012-12-06T14:47:08.943 に答える