Domanda

Sto cercando di copiare un SPListItem (con file) da una raccolta siti a un'altra. Lo faccio creando il file in questo modo:

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

tramite un metodo di utilità che ho scritto, ho quindi impostato tutti i valori dei campi del nuovo elemento in modo che corrispondano all'elemento originale in questo modo

Utilities.PopulateListItemMetadata(....)

Il fatto è che questo non persiste nel campo Autore.

Ho provato a impostare esplicitamente il campo Autore in ogni modo immaginabile, ad esempio in questo modo:

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

E così

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

Ma non appena viene chiamato il metodo SPListItem.Update (), il campo archiveItem [" Author "] è tornato a sharepoint \ system. Sono un po 'perplesso qui, dovrebbe funzionare ..

P.S. il metodo SPListItem.GetUser è un metodo di estensione

P.P.S. Il codice viene eseguito da un processo timer ...

Modifica: sono stati effettuati ulteriori scavi aggiungendo un nuovo campo al tipo di contenuto e quindi impostando quel campo in modo da riflettere l'autore dell'elemento originale, ma non è nemmeno impostato. Tuttavia, web.EnsureUser (nome utente) restituisce l'utente corretto. È strano o cosa!?!

È stato utile?

Soluzione

Trovato la risposta, usando

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

ha fatto il trucco!

Altri suggerimenti

Ho riscontrato lo stesso problema. Dai un'occhiata a questa domanda .

Il modo in cui ha funzionato per me è racchiudere lo stesso codice che hai nell'esempio finale in privilegi elevati.

Modifica

Perché non provi a sostituire:

SPUser user = newsArchive.SiteUsers[userName];

con:

SPUser user = newsArchive.EnsureUser(userName);

Quindi saprai che l'utente è nel web e otterrai anche un riferimento a loro. La raccolta SiteUsers ti dà gli utenti nella raccolta siti: non sono stati necessariamente aggiunti al Web. Se SharePoint non trova l'utente, probabilmente utilizzerà l'account di sistema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top