3

SPListItem(ファイル付き)をあるサイトコレクションから別のサイトコレクションにコピーしようとしています。これを行うには、次のようなファイルを作成します。

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

私が書いたユーティリティメソッドを使用して、新しいアイテムのすべてのフィールド値を元のアイテムに対応するように設定します。

Utilities.PopulateListItemMetadata(....)

重要なのは、これはAuthorフィールドを永続化しないということです。

たとえば、次のように、考えられるあらゆる方法でAuthorフィールドを明示的に設定してみました。

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に戻ります。私はここで少し途方に暮れています、これはうまくいくはずです。

PSSPListItem.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);

そうすれば、ユーザーがWebにいることがわかり、それらへの参照も取得できます。SiteUsersコレクションは、サイトコレクション内のユーザーを提供します。ユーザーは必ずしもWebに追加されているわけではありません。SharePointがユーザーを見つけられない場合は、おそらくシステムアカウントを使用します。

于 2009-06-26T08:24:34.810 に答える