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ê!?!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top