4

私はいくつかのサイトの下にある SharePoint 2010 のプロジェクトに取り組んでいます。各サイトの下にはニュースのリストが含まれており、それらのリストにイベント レシーバーを添付したいと考えています。

下のサイトとリストはプログラムで作成されますが、VS2010 ソリューションにあるイベント レシーバーをアタッチできません。

私はこれで試しました:

SPList list = new SPSite(siteURL).OpenWeb().Lists[listName]; 
SPEventReceiverDefinitionCollection eventReceivers = list.EventReceivers;

SPEventReceiverDefinition eventReceiver = eventReceivers.Add();
eventReceiver.Name = receiverName;
eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous; 
eventReceiver.Type = SPEventReceiverType.ItemAdded;
eventReceiver.SequenceNumber = sequenceNumber; 
eventReceiver.Assembly = assemblyFullName;
eventReceiver.Class = assemblyClassName;
eventReceiver.Data = receiverData;

eventReceiver.Update();

しかし、うまくいきません。

エラー メッセージは、「ファイルまたはアセンブリ 'Projekt_Test1\, \, Version\=1.0.1777.23493\, Culture\=neutral\, PublicKeyToken\=49c7547d535382ab' またはその依存関係の 1 つを読み込めませんでした。指定されたアセンブリ名またはコードベースが無効でした。 (HRESULT からの例外: 0x80131047)"

手伝ってくれてありがとう。

4

3 に答える 3

8

私はこれのためにリスト拡張メソッドを作成することになります:

public static void EnsureEventReceiver(this SPList list,IEnumerable<SPEventReceiverType> receiverTypes, Type eventHander, SPEventReceiverSynchronization synchronization, int sequenceNumber)
{
   foreach (SPEventReceiverType spEventReceiverType in receiverTypes)
   {
      string name = list.Title + spEventReceiverType.ToString();

      if (list.EventReceivers.Cast<SPEventReceiverDefinition>().All(i => i.Name != name))
      {
          SPEventReceiverDefinition eventReceiver = list.EventReceivers.Add();
          eventReceiver.Name = name;
          eventReceiver.Type = spEventReceiverType;
          eventReceiver.Assembly = eventHander.Assembly.FullName;
          eventReceiver.Class = eventHander.FullName;
          eventReceiver.SequenceNumber = sequenceNumber;
          eventReceiver.Synchronization = synchronization;
          eventReceiver.Update();
      }
   }    
}

警告、この方法の制限:

  • リストごとに1つのイベントのみ。これで十分なので、さらに必要な場合は、名前をパラメーターとして渡す必要があります。
  • イベントハンドラメソッドは同じクラスにあります

次のように使用できます。

list.EnsureEventReceiver(
     new[] { SPEventReceiverType.ItemAdded, SPEventReceiverType.ItemUpdated },
     typeof(NewsItemsHandler),
     SPEventReceiverSynchronization.Synchronous, 
     10000);
于 2012-10-24T07:49:13.177 に答える
2

いくつかの注意事項:

  1. アセンブリのバージョンは 1.0.1777.23493 として表示されます。自動インクリメントされているようです。固定アセンブリ バージョンを設定するか、ビルドごとに更新され、コードが壊れます。
  2. eventReceiver.Synchronization = SPEventReceiverSynchronization.Synchronous を設定していますが、ItemAdded は非同期イベントです。
  3. コードを実行する前に、イベント レシーバー アセンブリが SharePoint サーバー上の GAC に展開されていること、および IIS で SharePoint アプリケーション プールがリサイクルされていることを確認してください。
于 2012-05-22T14:43:28.990 に答える
2

あなたが使用しているこのバージョンでは、私は成功したことがありませんeventReceivers.Add()

これは私が使用しているpowershell Framgentです。C#でも非常に似ています

$ev = $currentList.EventReceivers.Add([Microsoft.SharePoint.SPEventReceiverType]::ItemAdded, $assemblyName, $className);
于 2012-05-22T14:34:12.667 に答える