Переименовано в поле "Изменить по" после использования повышенного режима

В настоящее время я сталкиваюсь с проблемой использования повышенного режима, используемого в функции.

Я создал обычную роль безопасности SharePoint (добавьте роль без права удаления). Цель моей функции SharePoint заключается в следующем:

При загрузке файла на сайт SP имя файла необходимо переименовать, используя выбранные метаданные. При загрузке файла вторая форма просит пользователя указать 3 или 4 метаданных.

Чтобы переименовать файл, я разработал следующий код:

    Public override void ItemAdded(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}


Public override void ItemUpdated(SPItemEventProperties properties)
{
SPSecurity.RunWithElevatedPrivileges(delegate()
       {
CallFunctionToUpdate();
});
}



Public void CallFunctionToUpdate()
{
try
       {
        this.EventFiringEnabled = false;
              using (SPWeb newWeb = newSite.OpenWeb(_properties.RelativeWebUrl))
              {
SPListItem item = newWeb.Lists[_properties.ListId].GetItemById(_properties.ListItem.ID);
newFileName = FilenameManagementHelper.GenerateFilename(properties.ListItem);

                     currentName = properties.ListItem["Name"].ToString();
                     var extension = Path.GetExtension(currentName);

                     if (item["Title"] == null || item["Title"].ToString() != newFileName)
                     {
                        item["Title"] = newFileName;
item["Editor"] = new SPFieldUserValue(properties.OpenWeb(), properties.OpenWeb().CurrentUser.ID, properties.OpenWeb().CurrentUser.LoginName);
                            item.SystemUpdate();
                     }

                     if (currentName.Substring(0, currentName.Length - extension.Length) != newFileName)
                     {
                        SPList list = newWeb.Lists[_properties.List.Title];
                           string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;

                           SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
                           byte[] bin = fileToMove.OpenBinary();
                           folder.Files.Add(destUrl, bin, fileToMove.Properties, true);

fileToMove.Delete();                             newWeb.Lists[list.RootFolder.Url].Update();
                        }

                     }
}
       catch (Exception ex)
       {
           DocumentDiagnosticService.LogError(CategoryID.Error, string.Format("Error {0} for the file name - {1}", ex.Message, currentName));
}
       finally
       {
        this.EventFiringEnabled = true;
       }

}

Перед переименованием имени файла я обновляю заголовок поля (метаданных) и редактор. Второй шаг будет перемещать файл (с метаданными и историей, связанной с загруженным файлом)

Я использую повышенный режим, потому что пользователь с ограниченной ролью безопасности не может удалить. В разработанном коде я перемещаю переименованный файл и удаляю старый загруженный файл.

Я нашел этот подход, потому что мне нужно сохранить версии. Непосредственное обновление имени файла (например, заголовка) не допускается, и это теряет историю. Пример: файл будет загружен, имя файла будет обновлено с использованием метаданных. Для первой версии проблем нет. Загрузка второго файла с такими же метаданными, как уже существует существующий файл с таким же именем, что приведет к ошибке. Используя Files.Add, это перенаправит текущий файл и сохранит историю.

Моя проблема в этом случае: когда пользователь загружает файл, поля Title и Editor корректно заменяются. Затем перемещаем файл, переименовываем поле Имя и удаляем старую версию. В этот момент поле "Изменить по" постоянно появляется у администратора системы SharePoint.

Как я могу сохранить Modifiy с именем человека, который загружает файл?

РЕДАКТИРОВАТЬ:

Используя следующий код:

SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
folder.Files.Add(destUrl, bin, fileToMove.Properties, true);
fileToMove.Delete();     

Позвольте мне переместить файл с метаданными, выбранными во время загрузки. У меня все еще есть версия, если текущая версия уже загружена, НО измененным пользователем является SysAdmin.

Используя следующий код:

SPList list = newWeb.Lists[_properties.List.Title];
string destUrl = list.RootFolder.Url + "/" + newFileName + extension;
SPFile fileToMove = list.Items[_properties.ListItemUniqueId].File;
SPFolder folder = newWeb.GetFolder(list.RootFolder.Url);
byte[] bin = fileToMove.OpenBinary();
SPUser author = fileToMove.Author;
folder.Files.Add(destUrl, bin, author, author, DateTime.Now, DateTime.Now);
fileToMove.Delete();                          

Позвольте мне переместить файл и сохранить историю, если у меня уже есть версия. Теперь я могу получить поле Modified By, заполненное реальным пользователем, который загружает, а не SysAdmin, НО я теряю метаданные, выбранные во время загрузки.

Спасибо за поддержку,

Фикс.

2 ответа

Решение

Спасибо за поддержку. Я решил свою проблему с помощью следующего кода:

folder.Files.Add(destUrl, bin, fileToMove.Properties, author, author, DateTime.Now, DateTime.Now, true);

Теперь у меня есть значение Modified By, заполненное пользователем, который загружает данные, метаданные все еще там и версионирование тоже.

Использование item.Update() вместо SystemUpdate(), Он должен сохранить личность вошедшего в систему пользователя.

Другие вопросы по тегам