ItemUpdated не срабатывает, когда документ добавляется в библиотеку документов не по умолчанию

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/98830

Вопрос

У меня есть приемник элементов, который реализует 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 работать в вашей системе.

Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top