Как создать новый элемент в виде ссылки на файл в библиотеке документов?

Мне нужно использовать метод SPFileCollection.Add, чтобы добавить новый элемент в библиотеку документов, но перегрузка этого метода, похоже, не подходит.

Сценарий: если файл добавлен в библиотеку документов и в поле выбора отделов с множественным выбором (флажками) выбраны значения, то событие itemUpdated должно создавать ссылки на добавленный файл в выбранном папка закупок отделов.

Что сейчас происходит: код добавляет файл как новый файл, а не как ссылку.

Я попробовал следующее...

string departments = Convert.ToString(properties.ListItem[Constants.Departments]);
if (!string.IsNullOrEmpty(departments))
{
string[] linkTargets = departments.Split(';', '#');

string purchasingLink = string.Concat(properties.Web.Url, "/", properties.List.RootFolder.Url, "/", Constants.Purchasing, "/");

foreach (string linkTarget in linkTargets)
{
    if (!string.IsNullOrEmpty(linkTarget))
    {
        SPFolder targetFolder = properties.Web.GetFolder(purchasingLink + linkTarget);
        SPFileCollection targetLibFiles = properties.List.RootFolder.Files;
        targetLibFiles.Add()
        string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);

        SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary());
        SPListItem newItem = newFile.Item;

        newItem[SPBuiltInFieldId.ContentType] = SPBuiltInContentTypeId.LinkToDocument;

        SPFieldUrlValue linkFieldValue = new SPFieldUrlValue();

        linkFieldValue.Url = fileUrl;

        newItem[SPBuiltInFieldId.URL] = linkFieldValue;

        newItem.Update();

          }
    }
}

ОБНОВЛЕНИЕ: Итак, я проверил запись в блоге, на которую ссылается Джеймс Михал Лукас в своем комментарии.

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

Hashtable itemProperties = new Hashtable();
SPContentTypeId ctId = SPBuiltInContentTypeId.LinkToDocument;
itemProperties["ContentTypeId"] = ctId.ToString();

string fileUrl = string.Concat(purchasingLink, linkTarget, "/", properties.ListItem.File.Name);

SPFile newFile = targetLibFiles.Add(fileUrl, properties.ListItem.File.OpenBinary(), itemProperties);

Выполнение этого, а затем проверка типа содержимого нового элемента с помощью powershell показывает:
PS C:\Users\xy> $file.Item.ContentType.Name
Ссылка на документ

Однако удаление исходного файла не отключает «ссылку». Он все еще работает нормально. Так что это все-таки не ссылка.


person noobischernoob    schedule 23.12.2015    source источник
comment
Я могу предложить только этот пост в блоге, который может помочь: erroreimprevisto.wordpress.com/2014/05/10/. Не самая элегантная помощь, которую я знаю!   -  person James Michael Lucas    schedule 23.12.2015


Ответы (1)


Мне удалось найти решение с помощью этот пост.
Вкратце:
Добавить SPLink напрямую не представляется возможным, вам придется подделывать его. В сообщении описывается, как создать файл .aspx, который будет создаваться при добавлении ссылки с помощью графического интерфейса. Затем этот файл добавляется в библиотеку как новый элемент и представляет собой ссылку.

person noobischernoob    schedule 28.12.2015