Definir campo autor em SPListItem não persistirá
-
20-08-2019 - |
Pergunta
Eu estou tentando copiar um SPListItem (com arquivo) de um conjunto de sites para outro. I fazer isso criando o arquivo como este:
var archiveFile = newsArchive.Lists[listName].RootFolder.Files.Add(originalItem.File.Name, originalItem.File.OpenBinary());
var archiveItem = archiveFile.Item;
através de um método utilitário que eu escrevi Eu, então, definir todos os valores de campo do novo item para corresponder com o item original como assim
Utilities.PopulateListItemMetadata(....)
A coisa é, este não persiste o campo Autor.
Eu tentei definindo o campo Autor explicitamente em todas as maneiras imagináveis, por exemplo assim:
string userName = originalItem.GetUser("Created by").LoginName;
SPUser user = newsArchive.SiteUsers[userName];
archiveItem["Author"] = user.ID + ";#" + user.LoginName;
archiveItem.Update();
E como assim
string userName = originalItem.GetUser("Created by").LoginName;
SPUser user = newsArchive.SiteUsers[userName];
archiveItem["Author"] = user;
archiveItem.Update();
Mas assim que o método SPListItem.Update () é chamado, o campo archiveItem [ "Autor"] foi revertido para sharepoint \ system. Estou um pouco em uma perda aqui, isso deve funcionar ..
P.S. o método SPListItem.GetUser é um método de extensão
P.P.S. Código está sendo executado a partir de um trabalho de timer ...
Edit: Será que um pouco mais cavando através da adição de um novo campo para o tipo de conteúdo e, em seguida, definir o campo para refletir o autor do item original, mas isso não está definido qualquer um. No entanto, o web.EnsureUser (username) não devolver o usuário correto. É este o estranho ou o quê!?!
Solução
Encontrou a resposta, usando
SPFieldUserValue val = new SPFieldUserValue(newsArchive, user.ID, user.Name);
archiveItem["Author"] = val;
archiveItem.SystemUpdate(false);
fez o truque!
Outras dicas
Eu experimentei o mesmo problema. Ter um olhar para esta questão .
A maneira que funcionou para mim é para embrulhar o mesmo código que você tem no seu exemplo final em privilégios elevados.
Editar
Por que você não tente substituir:
SPUser user = newsArchive.SiteUsers[userName];
com:
SPUser user = newsArchive.EnsureUser(userName);
Em seguida, você vai saber que o usuário está na web e também obter uma referência a eles. A coleção SiteUsers dá-lhe os usuários do conjunto de sites - eles não foram necessariamente adicionados à web. Se o SharePoint não encontrar o usuário provavelmente vai usar a conta do sistema.