在SPListItem中设置author字段将不会保留

Col*_*lin 3 sharepoint copy sitecollection splistitem

我试图将SPListItem(带文件)从一个网站集复制到另一个网站集.我通过创建这样的文件来做到这一点:

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

通过我编写的实用工具方法,然后将新项目的所有字段值设置为与原始项目相对应,如此

Utilities.PopulateListItemMetadata(....)
Run Code Online (Sandbox Code Playgroud)

问题是,这不会持续作者字段.

我尝试以各种可想象的方式明确地设置Author字段,例如:

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

就像这样

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

但是一旦调用了SPListItem.Update()方法,archiveItem ["Author"]字段就会恢复为sharepoint\system.我在这里有点不知所措,这应该有效..

PS SPListItem.GetUser方法是一种扩展方法

PPS代码正在从计时器作业运行...

编辑:通过向内容类型添加新字段然后设置该字段以反映原始项目的作者,进行了更多挖掘,但也未设置.但是,web.EnsureUser(用户名)确实返回了正确的用户.这很奇怪还是什么!?!

Col*_*lin 6

找到答案,使用

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

做了伎俩!