Установка поля автора в SPListItem не будет сохраняться - PullRequest
3 голосов
/ 26 июня 2009

Я пытаюсь скопировать SPListItem (с файлом) из одного семейства сайтов в другое. Я делаю это, создавая файл так:

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

с помощью служебного метода, который я написал, я затем установил все значения полей нового элемента так, чтобы они соответствовали исходному элементу, например:

Utilities.PopulateListItemMetadata(....)

Дело в том, что это не сохраняется поле Автор.

Я попытался установить поле Author явно во всех мыслимых ситуациях, например, так:

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

И вот так

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

Но как только вызывается метод SPListItem.Update (), поле archiveItem ["Author"] возвращается в sharepoint \ system. Я немного растерялся, это должно сработать ..

P.S. метод SPListItem.GetUser является методом расширения

P.P.S. Код запускается из задания таймера ...

Редактировать: Сделал еще несколько копаний, добавив новое поле к типу контента, а затем установив это поле, чтобы отразить автора оригинального элемента, но это также не задано. Однако web.EnsureUser (имя пользователя) возвращает правильного пользователя. Это странно или как??!

Ответы [ 2 ]

6 голосов
/ 26 июня 2009

Нашел ответ, используя

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

сделал свое дело!

0 голосов
/ 26 июня 2009

У меня возникла такая же проблема. Посмотрите на этот вопрос .

Способ, который работал для меня, - это обернуть тот же код, что и в вашем последнем примере, в привилегированные права.

Редактировать

Почему бы вам не попробовать заменить:

SPUser user = newsArchive.SiteUsers[userName];

с:

SPUser user = newsArchive.EnsureUser(userName);

Тогда вы будете знать, что пользователь находится в сети, а также получите ссылку на него. Коллекция SiteUsers предоставляет вам пользователей из семейства сайтов - они не обязательно были добавлены в Интернет. Если SharePoint не найдет пользователя, он, вероятно, будет использовать системную учетную запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...