Прежде всего, это зависит от того, работает ли ваш приемник событий в Списке или Библиотеке документов.
Проверьте этот сайт на удобные таблицы, когда BeforeProperties
, AfterProperties
и properties.ListItem
заполнены.
Редактировать: ссылка мертва
http://www.synergyonline.com/blog/blog-moss/Lists/Posts/Post.aspx?List=fcb287b5%2D7a1a%2D4206%2Da04f%2D2a97805e4a25&ID=25. Я выручил содержимое, используя Wayback Machine https://web.archive.org/web/20100623125934/http://www.synergyonline.com/blog/blog-moss/Lists/Posts/Post.aspx?List=fcb287b5-7a1a-4206-a04f-2a97805e4a25&ID=25.
Оригинальное содержание ниже от Рэнди Уильямса:
Как многие из вас знают, приемники событий - отличный способ подключиться к различным событиям SharePoint. Они могут применяться к событиям Feature, таким как FeatureActivation, событиям List, таким как FieldAdded, и многим другим. Однако наиболее часто используемый набор получателей является частью SPItemEventReceiver, который позволяет связывать ваш код с рядом событий, которые могут произойти с элементами в списке или библиотеке.
При работе с событиями вы быстро обнаружите, что до (синхронные) и после (асинхронные) события существуют, а суффикс метода, такой как «ing» (например, ItemAdding) и «ed» (например, ItemAdded), сообщит вам вызывается ли он до или после фактического изменения. Основные вещи.
И, когда вы углубитесь, вы даже обнаружите, что можете извлечь состояние изменения до и после. Например, вы можете подключиться к событию ItemUpdating для библиотеки документов и запретить пользователю изменять определенный столбец. Код может выглядеть так:
public override void ItemUpdating(SPItemEventProperties properties)
{
if (properties.BeforeProperties["column"] != properties.AfterProperties["column"])
{
properties.Cancel = true;
properties.ErrorMessage = "This column cannot be changed";
}
}
Для библиотеки документов это работает просто отлично. Однако вы должны знать, что хэш-таблица BeforeProperties не заполняется для элементов в списке. Как сказано в SDK: «Для документов свойства« До »и« После »гарантированы для событий после публикации, таких как ItemUpdated, но свойства« До »недоступны для событий после публикации в элементах списка» *
Когда они говорят «недоступно для публикации событий в элементах списка», они имеют в виду после событий (таких как ItemUpdated, ItemDeleted и т. Д.)? Формулировка здесь любопытна, поэтому я подумал, что мне понадобится время, чтобы протестировать каждую комбинацию общих событий, таких как «Добавить», «Обновить» и «Удалить». Они были сделаны через пользовательский список и затем библиотеку документов. Каждый тест включал добавление нового элемента, редактирование элемента, а затем удаление элемента. Вот результаты для списка:
List BeforeProperties AfterProperties properties.ListItem
ItemAdding No value New value Null
ItemAdded No value New value New value
ItemUpdating No value Changed value Original value
ItemUpdated No value Changed value Changed value
ItemDeleting No value No value Original value
ItemDeleted No value No value Null
Нет значения означает, что значение столбца в хеш-таблице было недоступно.
Новое значение означает, что правильное значение для столбца было доступно.
Измененное значение означает, что правильное обновленное значение было доступно.
Исходное значение означает, что было доступно правильное исходное значение.
Вот тот же тест с библиотекой документов:
Library BeforeProperties AfterProperties properties.ListItem
ItemAdding No value No value Null
ItemAdded No value No value New value
ItemUpdating Original value Changed value Original value
ItemUpdated Original value Changed value Changed value
ItemDeleting No value No value Original value
ItemDeleted No value No value Null
Properties.ListItem ссылается на текущее значение элемента списка в этой точке события. Ноль означает, что элемент недоступен. Мой анализ дает следующие результаты:
Не удивительно, что мы получаем нулевые значения для ItemAdding (до добавления элемента) и ItemDeleted (после удаления элемента). Это доказал Исаи Саги некоторое время назад.
Как правильно задокументировано в SDK, события элементов для списков не раскрывают свойства BeforeProperties.
ItemAdding и ItemAdded правильно сообщают значение в AfterProperties для элемента списка, но не для элемента библиотеки. Это любопытно.
Мы не видим предыдущие состояния во время события ItemDeleted. Как только оно удалено, оно явно исчезло.
Итак, если мы вернемся к нашей первоначальной проблеме, указанной выше. Как мы можем предотвратить изменение пользователем определенного столбца для элемента в списке событий? Из таблицы списка вы можете увидеть, подключаемся ли мы к событию ItemUpdating, мы можем сравнить значение текущего элемента (properties.ListItem) со значением AfterProperties. Код будет выглядеть так:
if (properties.ListItem["column"] != properties.AfterProperties["column"])
{
properties.Cancel = true;
properties.ErrorMessage = "This column cannot be changed";
}
Я надеюсь, что этот пост даст вам лучшее представление о том, как до и после событий работают как для списков, так и для библиотек. Ваши комментарии и отзывы всегда приветствуются.