0

我非常想瘋了,試圖讓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(); 
+0

您是否註冊過活動接收器?你確定你的事件接收器沒有被調用嗎?你有沒有嘗試在事件接收器的開頭部署斷點? –

+0

我可以把EventReceiver的最早位置放在ItemAdding的第一行...所以我把它放在那裏,但是我的代碼不會中斷,請在user735768的帖子下面看到我的評論以獲取更多詳細信息。 –

回答

1

這裏是你應該做的:

  1. 重新啓動IIS「卸載DLL文件,如果他們使用」
  2. 把你的DLL和PDB文件中的GAC文件夾適用於此DLL
  3. 打開SharePoint網站,以便新的w3wp進程啓動d。
  4. 將您的VS項目附加到w3wp請確保您在附加到進程對話框中選擇託管代碼。
  5. 嘗試上傳文件6-現在應該能夠捕捉到中斷點。

您可以在生成後事件中調用Shell腳本來自動執行所有這些步驟。

+0

我不確定放置pdb文件的位置,如果我嘗試將pdb放在那裏,GAC會拋出錯誤,因此我只將該DLL放入GAC中。我已經打開了sharepoint,並且像您所說的那樣附加到了一個流程中,但即使在我上傳文件時仍然沒有任何中斷點。任何其他想法? –

+0

請看看@此鏈接http://timrayburn.net/blog/how-to-put-pdbs-in-the-gac/ –

+0

或映射網絡驅動器以避免使用cmd –

0

您究竟如何調試? 你需要附加到適當的w3wp.exe進程並添加一個項目,如果斷點不起作用,通常是因爲最後部署的dll的版本比Visual Studio中的代碼更新(即使是最輕微的更改也會導致此問題如新線等的差異)

+0

好的,以便調試我附加到w3wp進程,我發現我的應用程序池的權利之一。我在ItemAdding的第一行放置了一個斷點並點擊F5。現在斷點變成空心的(不是紅色,因爲它通常是),它表示符號尚未加載,我嘗試使用模塊窗口加載符號,但它仍然不會加載它們,我應該在哪裏瀏覽它們? –

+0

我試過兩次重新創建項目,但仍然無法獲得此項工作,我使用了EventReceiver項目,並且檢查了項目的/ bin文件夾.dll和pdb文件在它們上都有相同的名稱和時間,我應該檢查一下嗎? –

+0

無需點擊F5,它應該捕獲您的代碼在sharepoint中出現的任何內容。無論如何,如果斷點是空洞的,通常它是由於最後部署的dll和Visual Studio中當前的代碼之間的差異(只需重新部署以確保)。 另一個選擇是什麼petro建議檢查他的意見 – liranco