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

时间:2009-06-26 08:13:59

标签: sharepoint copy splistitem sitecollection

我正在尝试将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(用户名)确实返回了正确的用户。这是奇怪的还是什么!?!

2 个答案:

答案 0 :(得分:6)

使用

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

做了伎俩!

答案 1 :(得分:0)

我遇到了同样的问题。看看this question

对我有用的方法是将你在最后一个例子中使用的相同代码包装在提升的权限中。

修改

你为什么不尝试更换:

SPUser user = newsArchive.SiteUsers[userName];

使用:

SPUser user = newsArchive.EnsureUser(userName);

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