2009-06-26 8 views
3

1つのサイトコレクションから別のサイトコレクションにSPListItem(ファイル付き)をコピーしようとしています。私はそのようにSPListItemの作成者フィールドが保持されません。

Utilities.PopulateListItemMetadata(....) 

ことのようにオリジナルのアイテムに対応するために、新しいアイテムのすべてのフィールド値を設定して書いたユーティリティメソッドを通じて

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

:私はこのようなファイルを作成することによって、これを行いますこれは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に戻りました。私はここで紛失しているが、これはうまくいくはずだ。

P.S. SPListItem.GetUserメソッドは拡張メソッドです

P.P.S.コードは...

編集タイマージョブから実行されている:いくつかは、より多くのコンテンツタイプに新しいフィールドを追加し、元のアイテムの作者を反映するために、そのフィールドを設定することで掘りましたが、それは設定されていませんどちらか。ただし、web.EnsureUser(username)は正しいユーザーを返します。これは奇妙なものなのですか?

答えて

6

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

を使用して、答えを見つけることがトリックをしました!

+0

新しいSPFieldUserValueを作成することは、おそらくそれを正しくnewsArchiveにマッピングすることでしょうか?役に立った、ありがとう! –

+0

おそらく、コンストラクタはSPWebへの明示的な参照を必要とするでしょうか? – Colin

+0

SystemUpdate(false)は、SystemUpdate()によって短縮できます。 –

0

私は同じ問題を経験しました。 this questionをご覧ください。

あなたの最終的な例で使用しているのと同じコードを昇格された権限でラップすることです。

SPUser user = newsArchive.EnsureUser(userName); 

はその後、ユーザーがウェブに知っているだろうし、また参照を取得:

SPUser user = newsArchive.SiteUsers[userName]; 

で:

編集

なぜあなたは交換してみません彼らへ。 SiteUsersコレクションは、サイトコレクション内のユーザーを提供します。必ずしもWebに追加されているわけではありません。 SharePointがユーザーを見つけられない場合、おそらくシステムアカウントを使用します。

+0

すでに確認済みで、SystemUpdateとUpdateを試しましたが、それでもsytemaccountに戻ります... – Colin

+0

編集を参照してください。それ以外の場合はわかりません! –

+0

私はそれを試しましたが、私は前に試してみました。 RunWithElevatedPrivilegesにすべてをラップし、AllowUnsafeUpdatesをコードに追加します。 P.S.それはタイマージョブから実行されています... – Colin