0

私は、SharePoint リスト イベント レシーバーを機能させようとしています。VS で EventReceiver プロジェクトを作成し、デバッグできますが、ブレーク ポイントが機能しません。基本的に、多くの人が抱えているのと同じ問題ですが、解決策はどれもうまくいかないようです。以前にこれを投稿しましたが、イベント レシーバー コードは機能するはずですが、リスト自体で機能するようには見えません。(私のコードは下に貼り付けられています)

基本的に必要なのは、イベント レシーバーがアップロードされたドキュメントの名前を変更することだけです。クライアント A ドキュメントと呼ばれるドキュメントがアップロードされ、クライアント A ドキュメント 1 と呼ばれる最初のドキュメントである場合、このシナリオを検討してください。次にアップロードされるドキュメントがクライアント A ドキュメントと呼ばれる場合は、名前をクライアント A ドキュメント 2 に変更する必要があります。 . ここで、Client B Document という名前の別のドキュメントがアップロードされた場合、同じ名前のドキュメントは他にないため、Client B Document 1 になります。今、私は以下のコードがこの動作を達成していると思います (コードは Robert Christs の助けのおかげで書かれました!) しかし、それをテストする方法がわかりません。

ドキュメントをアップロードするか、新しいドキュメントを作成しますか? 私は両方を試しましたが、何もうまくいきません。これを達成する方法はありますか? 私はこの要件で頭がおかしくなり始めています。

public override void ItemAdding(SPItemEventProperties properties)
{
   base.ItemAdding(properties);

   SPListItem item = properties.ListItem;

   if (item == null || item["Name"] == null) //item["Name"] == null)
       return; //or better yet, log 

   string oldFileName = item["Name"].ToString();

   int positionOfPeriod = oldFileName.LastIndexOf(".");
   string tempFileName = oldFileName.Substring(0, positionOfPeriod);

   SPQuery query = BuildArbitraryQuery(properties.List, "Name", tempFileName, true);
   int count = properties.List.GetItems(query).Count;
   String fileName, fileExtension;

   if (positionOfPeriod == -1)
   {
       fileName = oldFileName;
       fileExtension = "";
   }
   else
   {
       fileName = oldFileName.Substring(0, positionOfPeriod);
       fileExtension = oldFileName.Substring(positionOfPeriod);
   }

   string newFileName = fileName + "-xx" + count.ToString() + fileExtension;

   item["Name"] = newFileName;

   Console.WriteLine("New File Name: " + newFileName);

   try
   {
       properties.Web.AllowUnsafeUpdates = true;
       EventFiringEnabled = false;

       item.Update();
   }
   finally
   {
       properties.Web.AllowUnsafeUpdates = false;
       EventFiringEnabled = true;
   }
}
/// <summary> 
/// Builds an arbitrary SPQuery which filters by a single column value. 
/// </summary> 
/// <param name="list">The list you will run the query against.</param> 
/// <param name="columnDisplayName">The Display Name of the column you want to filter.</param> 
/// <param name="value">The value to filter against.</param> 
/// <returns>A new SPQuery object ready to run against the list.</returns> 
public static SPQuery BuildArbitraryQuery(SPList list, string columnDocumentName, string value, bool deepSearch)
{
   if (list == null)
       throw new ArgumentNullException("You cannot pass a null list to Helper.BuildArbitraryQuery.");

   if (!list.Fields.ContainsField(columnDocumentName))
       throw new ArgumentException("The SharePoint List \"" + list.Title + "\" does not contain the Field \"" + columnDocumentName + "\".");

   string internalName = list.Fields[columnDocumentName].InternalName;
   SPQuery query = new SPQuery();
   query.Query = "<Where><Eq><FieldRef Name=\"" + internalName + "\"/><Value Type=\"Text\">" + value + "</Value></Eq></Where>";

   if (deepSearch)
       query.ViewAttributes += "Scope='RecursiveAll'";

   return query;
}

編集: - - - - - - - - - - - - - - - - - - - - - - - - -- では、同じプロジェクト タイプ (イベント レシーバー) を使用して少しテストを開始し、リスト アイテムの名前を現在の日付に変更するための非常に単純な ItemAdded メソッドを作成しました。これはカスタム リストで機能するようになりましたが、ドキュメント ライブラリでは機能しないようです。

この簡単なテストから、F5 キーを使用してカスタム リスト (サンドボックス ソリューション) にイベント レシーバーを登録し、それをデバッグできることがわかりましたが、ドキュメント ライブラリの違いは何でしょうか? また、貼り付けたコードは、ドキュメント ライブラリで行おうとしていることに問題がありますか?

これは小規模なテストに使用したコードですが、カスタム リストではなくドキュメント ライブラリ用の新しいプロジェクト タイプを作成しても、ドキュメント ライブラリでは機能しません (これは ItemAdded にあります)。

       SPListItem currentItem = properties.ListItem;
       currentItem["Title"] = DateTime.Now.ToString();
       currentItem.Update();
4

2 に答える 2

1

これがあなたがすべきことです:

  1. IIS を再起動して、「使用されている場合は DLL をアンロードします」
  2. DLL とその pdb ファイルを、この DLL に適した GAC フォルダーに配置します。
  3. 新しい w3wp プロセスが開始されるように、SharePoint Web サイトを開きます。
  4. VS プロジェクトを w3wp にアタッチしたら、[プロセスにアタッチ] ダイアログでマネージド コードを選択してください。
  5. ファイル 6 をアップロードしてみてください。これで、ブレーク ポイントをキャッチできるはずです。

このすべてのステップを自動化するために、ビルド後のイベントで呼び出すことができるシェル スクリプトを作成できます。

于 2012-09-07T19:39:38.913 に答える
0

どのくらい正確にデバッグしようとしていましたか? 適切な w3wp.exe プロセスにアタッチして項目を追加する必要があります。ブレークポイントが機能しない場合は、通常、最後にデプロイされた dll のバージョンが Visual Studio のコードよりも新しいためです (わずかな変更でもこの違いが生じる可能性があります)。改行など)

于 2012-09-07T19:07:49.100 に答える