3

我正在尝试将 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。我在这里有点不知所措,这应该可以..

PS SPListItem.GetUser 方法是扩展方法

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

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

4

2 回答 2

6

找到答案,使用

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

成功了!

于 2009-06-26T09:45:48.127 回答
0

我遇到过同样的问题。看看这个问题

对我有用的方法是将您在最终示例中的相同代码包装在提升的特权中。

编辑

你为什么不尝试更换:

SPUser user = newsArchive.SiteUsers[userName];

和:

SPUser user = newsArchive.EnsureUser(userName);

然后您将知道用户在网络中,并获得对他们的引用。SiteUsers 集合为您提供站点集合中的用户 - 他们不一定已添加到 Web。如果 SharePoint 没有找到用户,它可能会使用系统帐户。

于 2009-06-26T08:24:34.810 回答