Question

J'essaie de copier un SPListItem (avec un fichier) d'une collection de sites vers une autre. Je le fais en créant le fichier comme ceci:

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

par le biais d’une méthode utilitaire que j’ai écrite, j’ai ensuite défini toutes les valeurs de champ du nouvel élément de manière à ce qu’elles correspondent à l’article d’origine, comme suit

Utilities.PopulateListItemMetadata(....)

Le problème, c’est que le champ Auteur n’est pas conservé.

J'ai essayé de définir le champ Auteur explicitement de toutes les manières imaginables, par exemple comme ceci:

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

Et comme si

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

Mais dès que la méthode SPListItem.Update () est appelée, le champ archiveItem [" Author "]] est redevenu sharepoint \ system. Je suis un peu désemparé ici, cela devrait marcher.

P.S. la méthode SPListItem.GetUser est une méthode d'extension

P.P.S. Le code est exécuté à partir d'un travail du minuteur ...

Modifier: vous avez encore creusé en ajoutant un nouveau champ au type de contenu, puis en le définissant de manière à refléter l'auteur de l'élément d'origine, mais ce n'est pas défini non plus. Cependant, web.EnsureUser (nom d'utilisateur) renvoie l'utilisateur correct. Est-ce étrange ou quoi!?!

Était-ce utile?

La solution

Vous avez trouvé la réponse à l'aide de

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

a fait le tour!

Autres conseils

J'ai rencontré le même problème. Consultez cette question .

Ce qui a fonctionné pour moi consiste à intégrer le même code que votre dernier exemple à des privilèges élevés.

Modifier

Pourquoi n'essayez-vous pas de remplacer:

SPUser user = newsArchive.SiteUsers[userName];

avec:

SPUser user = newsArchive.EnsureUser(userName);

Ensuite, vous saurez que l'utilisateur est sur le Web et obtiendrez également une référence. La collection SiteUsers vous donne les utilisateurs de la collection de sites. Ils n'ont pas nécessairement été ajoutés au Web. Si SharePoint ne trouve pas l'utilisateur, il utilisera probablement un compte système.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top