私は、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();