Я пытаюсь реализовать настройку в SharePoint 2010, чтобы при загрузке документа в библиотеку имя файла изменялось, чтобы в него входил идентификатор документа. (Я знаю, что людям больше не нужно беспокоиться об именах файлов, но у нас уже есть много устаревших файлов и пользователей, которым нравится иметь локальные копии).
Мне удалось реализовать специальный приемник событий для события ItemAdded, которое переименовывает файл, добавляя идентификатор документа перед именем файла. Это работает правильно из Интернета Загрузить.
Проблема с Обозревателем. Когда я пытаюсь добавить файл с помощью WebDAV в окне просмотра, я получаю две копии файла. Кажется, что когда файл загружается через Интернет, события, которые запускаются,
- ItemAdding
- ItemAdded
Но когда я копирую / вставляю файл в Проводник, я вижу следующие события:
- ItemAdding
- ItemAdded
- ItemAdding
- ItemAdded
- ItemUpdating
- ItemUpdated
В результате у меня есть два файла с разными именами (поскольку идентификаторы документов разные).
Я нашел много людей, обсуждающих эту проблему в Интернете ( эта - лучшая статья, которую я нашел). У кого-нибудь есть другие идеи? Будет ли больше смысла делать это в рабочем процессе, а не в получателе событий? Вместо этого я мог бы использовать запланированное задание, но это могло бы сбить пользователя с толку, если имя документа изменилось несколько минут спустя.
Это мой код, который отлично работает при загрузке через Интернет, но не при использовании Explorer View:
public override void ItemAdded(SPItemEventProperties properties)
{
try
{
SPListItem currentItem = properties.ListItem;
if (currentItem["_dlc_DocId"] != null)
{
string docId = currentItem["_dlc_DocId"].ToString();
if (!currentItem["BaseName"].ToString().StartsWith(docId))
{
EventFiringEnabled = false;
currentItem["BaseName"] = docId + currentItem["BaseName"];
currentItem.SystemUpdate();
EventFiringEnabled = true;
}
}
}
catch (Exception ex)
{
//Probably should log an error here
}
base.ItemAdded(properties);
}