L'impostazione del campo dell'autore in SPListItem non persisterà
-
20-08-2019 - |
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!?!
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.