2012-09-20 38 views
1

我正在嘗試爲博客網站(針對帖子列表)創建一個EventReceiver,並且在使其工作時遇到了一些麻煩。我想將創建者列更改爲匿名。基本上,我在控制檯應用程序中使用了整個工作,但是,只有在執行控制檯應用程序時纔會更改「創建者」列名稱。EventReceiver不會在SharePoint列表中觸發

無論何時將新項目添加到列表中,我都需要它來更改創建者。我的代碼如下....我如何修改這個在EventReceiver項目中使用?由於我已經告訴EventReceiver項目我想要連接到EventReceiver的URL,我不確定我可以從這段代碼中刪除什麼,現在它只是不做任何事情,沒有錯誤,也沒有修改「創建者」列時我調試。

using (SPSite site = new SPSite("http://test-sharepoint/subsite/")) 
    { 
     using (SPWeb web = site.OpenWeb()) 
     { 
      SPList list = web.Lists["Posts"]; 
      SPListItemCollection listItemCollection = list.Items; 

      foreach (SPListItem listItem in listItemCollection) 
      { 
       SPFieldUserValue userName = new SPFieldUserValue(web, 22, "Anonymous"); 
       listItem["Author"] = userName; 
       listItem["Editor"] = userName; 

       listItem.Update(); 
      } 
      web.Update(); 
     } 
    } 

編輯:代碼在ItemAdded方法

編輯#2:這是嘗試相同的代碼,只是沒有循環使用properties.ListItem,這是我在一個活動Recevier項目,但沒有運氣嘗試。它只是不改變創建領域,或任何字段爲此事(我試過的標題爲好)

 SPSite site = new SPSite("http://test-sharepoint/subsite/"); 
     SPWeb web = site.OpenWeb(); 
     SPFieldUserValue userName = new SPFieldUserValue(web, 22, "Anonymous"); 

     properties.ListItem["Author"] = userName; 
     properties.ListItem["Editor"] = userName; 
     properties.ListItem.Update(); 

*也從我的理解SPFieldUserValue會抓住任何一個用戶或SharePoint用戶組(權限),所以在我的代碼,在22抓住,我想和「無名氏」是從該組的用戶的SharePoint用戶組...


編輯#3:更多的進展,此代碼的工作,而不對問題但是,列表不適用於「帖子」或「評論」列表,因爲它不會更改「創建者」字段。這可能是因爲所有項目的批准/拒絕?無論是批准還是未顯示匿名,但正如我所提到的,它可以在另一個列表中正常工作。

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

     SPSite site = new SPSite("http://test-sharepoint/hr/blog/"); //SPContext.Current.Site; 
     SPWeb web = site.OpenWeb(); 
     SPFieldUserValue userName = new SPFieldUserValue(web,22,"Anonymous"); 

     SPListItem currentItem = properties.ListItem; 
     //currentItem["Title"] = userName; //DateTime.Now.ToString(); 
     currentItem["Author"] = userName; 
     currentItem["Editor"] = userName; 
     currentItem.SystemUpdate(); 
    } 

**編輯#4:好吧,我發現我的問題,創建項目時,我選擇了自定義列表作爲我的列表附加到,但我需要選擇帖子或評論,現在上面的代碼工作!

但現在我有另一個問題,博客上的所有帖子都首先提交審批......並且由於此事件接收器似乎不適用於管理員以外的其他用戶。它適用於管理員帳戶,我可以直接發佈帖子或評論,但對於具有Contribute權限的用戶,帖子已提交給審批人的用戶仍然可以在「管理帖子」頁面上顯示他們的姓名......我該怎麼做?任何想法**

,工程代碼:

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

     SPSite site = new SPSite("http://test-sharepoint/hr/blog/"); //SPContext.Current.Site; 
     SPWeb web = site.OpenWeb(); 
     SPFieldUserValue userName = new SPFieldUserValue(web, 23, "Anonymous"); 

     SPListItem currentItem = properties.ListItem; 
     currentItem["Author"] = userName; 
     currentItem["Editor"] = userName; 
     currentItem.SystemUpdate(); 
    } 
+0

請嘗試按照本指南來查看您是否執行了此處提及的所有步驟:http://www.dotnetcurry.com/ShowArticle.aspx?ID=649。另一件事是,你可以修改你的代碼,以使用'ItemAdded'事件接收器中可用的'properties'參數中的'ListItem'(或'ListItemId')。這樣你可以避免每次更新所有項目。 –

+0

感謝您的回覆,我實際上嘗試使用properties.ListItem而不是遍歷所有項目,但它仍然不起作用。我將在原始帖子中粘貼我的代碼... –

+0

代碼是否實際運行,但不會更改字段的值,您可以調試它?如果是這樣,請用調試器驗證是否沒有拋出異常並且所有行均已運行。我還假設具有3個參數的'SPFieldUserValue'構造函數應該將同一個查找用戶的id和值作爲目標。嘗試將其更改爲「SPFieldUserValue userName = new SPFieldUserValue(web,」Anonymous「);'。應該直接將匿名用戶添加到SharePoint用戶(如果您僅添加他所在的AD組,但不添加用戶本身,則可能無法正常工作)。 –

回答

0

針對編輯#4,與SharePoint工作時,如果當管理員帳戶執行的代碼工作,但當通過執行不工作一個「正常」的賬戶,權限很可能會受到責備。

有關修改作者字段的SPItemEventReceiver示例,請參閱answerSharePoint/WSS: Modify 「created by」 field?

注意:許多SharePoint開發人員建議不要使用RunWithElevatedPrivileges,並建議使用模擬。有關更多詳細信息,請參閱我的answerIn which situation use SPSecurity.RunWithElevatedPrivileges with superusertoken?問題。

相關問題