我非常想瘋了,試圖讓SharePoint List Event Receiver工作。我在VS中創建了一個EventReceiver工程,然後可以對其進行調試,但是,斷點不起作用。基本上它的問題很多人都有,但他們的解決方案似乎沒有任何工作。我之前發佈過,我認爲我的事件接收器代碼應該可以工作,但我似乎無法讓它在列表本身上工作。 (我的代碼粘貼在下面)如何測試EventReceiver?
基本上我需要的是事件接收器重命名上傳的文檔。考慮這種情況,如果文檔上傳時稱爲客戶端文檔,並且是第一個應該稱爲客戶端文檔1的文檔。如果上傳的下一個文檔稱爲客戶端文檔,則應將其重命名爲客戶端文檔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();
您是否註冊過活動接收器?你確定你的事件接收器沒有被調用嗎?你有沒有嘗試在事件接收器的開頭部署斷點? –
我可以把EventReceiver的最早位置放在ItemAdding的第一行...所以我把它放在那裏,但是我的代碼不會中斷,請在user735768的帖子下面看到我的評論以獲取更多詳細信息。 –