2009-06-26 87 views
3

我想從一個網站集複製SPListItem(與文件)到另一個網站集。我這樣做是通過創建類似這樣的文件:通過實用方法在SPListItem中設置作者字段將不會持續

var archiveFile = newsArchive.Lists[listName].RootFolder.Files.Add(originalItem.File.Name, originalItem.File.OpenBinary()); 
var archiveItem = archiveFile.Item; 

我寫的話,我設置新項目的所有字段值與原項目對應像這樣

Utilities.PopulateListItemMetadata(....) 

事情是,這不會持續作者字段。

我想明確地設定作者字段在各方面都可以想象,比如像這樣:

string userName = originalItem.GetUser("Created by").LoginName; 
SPUser user = newsArchive.SiteUsers[userName]; 
archiveItem["Author"] = user.ID + ";#" + user.LoginName; 
archiveItem.Update(); 

而像這樣

string userName = originalItem.GetUser("Created by").LoginName; 
SPUser user = newsArchive.SiteUsers[userName]; 
archiveItem["Author"] = user; 
archiveItem.Update(); 

但只要SPListItem.Update()方法稱爲,archiveItem [「Author」]字段已恢復到Sharepoint \ system。我在這裏有點茫然,這應該工作..

P.S. SPListItem.GetUser方法是擴展方法

P.P.S.代碼正在從計時器作業運行...

編輯:做了一些更多的挖掘,通過向內容類型添加新字段,然後設置該字段以反映原始作品的作者,但未設置無論是。但是,web.EnsureUser(用戶名)確實會返回正確的用戶。這是奇怪還是什麼!?!

回答

6

找到了答案,用

SPFieldUserValue val = new SPFieldUserValue(newsArchive, user.ID, user.Name); 
archiveItem["Author"] = val; 
archiveItem.SystemUpdate(false); 

的伎倆!

0

我遇到過同樣的問題。看看this question

對我而言,這種方式就是將您在最終示例中使用的相同代碼以提升的權限進行封裝。

編輯

你爲什麼不嘗試更換:

SPUser user = newsArchive.SiteUsers[userName]; 

有:

SPUser user = newsArchive.EnsureUser(userName); 

然後你會知道用戶是在網絡和也得到了參考給他們。 SiteUsers集合爲您提供網站集中的用戶 - 他們不一定會被添加到網絡中。如果SharePoint找不到用戶,它可能會使用系統帳戶。

+0

已經檢查出來,嘗試SystemUpdate和更新,它仍然恢復到sytemaccount ... – Colin 2009-06-26 08:26:40

+0

請參閱編輯,否則我不確定! – 2009-06-26 08:34:19