ItemUpdated не срабатывает, когда документ добавляется в библиотеку документов не по умолчанию
-
10-12-2019 - |
Вопрос
У меня есть приемник элементов, который реализует ItemUpdated()
для обработки элемента после его загрузки в библиотеку документов.Все работает нормально, если я добавляю документы в библиотеку «Общие документы» по умолчанию — при добавлении нового документа ItemUpdated()
срабатывает нормально.Однако, если я создам новая библиотека документов в том же семействе веб-сайтов, ItemUpdated()
не срабатывает, когда я загружаю в него новый документ.Но когда я загружаю другую версию или переименовываю документ и т. д., ItemUpdated()
срабатывает нормально - он просто не срабатывает при загрузке элемента.Типичный пример:
- Я загружаю «doc1» в библиотеку документов –
ItemUpdated()
не выполняется (но он выполняется, если библиотека документов является «общими документами»); - Я загружаю другую версию «doc1» —
ItemUpdated()
выполняется, как и ожидалось; - Я переименовываю «doc1» -
ItemUpdated()
выполняется так, как ожидалось.
Меня заставили поверить, что порядок событий при добавлении документа обычно следующий:
добавление - добавлено - обновление - обновлено
Так почему же мой ItemUpdated()
не запускается для библиотек, отличных от «Общих документов»?Есть ли какая-то настройка, которая может быть причиной этого?
Обратите внимание, что по разным причинам я не могу выполнить обработку внутри ItemAdded()
.
Элементы.xml:
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Receivers ListTemplateId="101">
<Receiver>
<Name>MyEventReceiverItemUpdated</Name>
<Type>ItemUpdated</Type>
<Assembly>$SharePoint.Project.AssemblyFullName$</Assembly>
<Class>MyProject.MyEventReceiver.MyEventReceiver</Class>
<SequenceNumber>1000</SequenceNumber>
</Receiver>
</Receivers>
</Elements>
Код:
public class MyEventReceiver : SPItemEventReceiver
{
// On document upload, this method is only entered if I upload to "Shared Documents"
public override void ItemUpdated(SPItemEventProperties properties)
{
base.ItemUpdated(properties); // doesn't get called either
MyMethod(properties);
}
}
Решение 2
Кажется, я нашел решение.я реализовал ItemAdded()
помимо оригинала ItemUpdated()
в приемнике событий.Внутри я вызываю последующий вызов ItemUpdated()
так:
public override void ItemAdded(SPItemEventProperties properties)
{
base.ItemAdded(properties);
properties.ListItem.UpdateOverwriteVersion();
}
Обратите внимание, что UpdateOverwriteVersion
«обновляет элемент без создания другой версии элемента» (MSDN).Это приводит к вызову ItemUpdated()
при добавлении нового элемента;кроме того, он не создает новую версию элемента (т.е.при первом добавлении нового элемента у вас не будет двух версий).Пока что это работает должным образом для всех библиотек документов, с управлением версиями и без них.
Другие советы
Есть ли у вас дополнительные столбцы в той или иной библиотеке?Кажется, это имеет значение с точки зрения того, срабатывает ли ItemUpdating() при загрузке.Посмотри на эта почта.Ключевое предложение там:
«События, которые запускаются во время, когда документ добавляется в библиотеку документов, могут включать Itemupdation и Itempdated.Но только в том случае, если в процесс включены дополнительные поля ».
Поэтому вам, возможно, захочется поэкспериментировать с различными конфигурациями библиотек в вашей среде, чтобы лучше понять, как эта «функция» SharePoint влияет на вашу систему.
Кроме того, я понимаю, что могут быть причины избегать ItemAdded.Если ItemUpdated по-прежнему является для вас проблемой и вы хотели бы поделиться некоторыми подробностями о том, почему ItemAdded нежелателен в вашей среде, рассмотрите возможность задать здесь отдельный вопрос о том, как заставить ItemAdded работать в вашей системе.
Удачи!