SPItemEventProperties и ItemUpdating, или Очередной привет от Sharepoint
17.06.2008 1 комментарий
У списка и типа содержимого есть различные Receivers — ItemUpdating, ItemAdding и т.д.
Как известно из SDK, чтобы перехватывать эти события, необходимо создать свой класс и переопределить в нем нужные методы.
Вот так выглядет ItemUpdating:
public override void ItemUpdating(SPItemEventProperties properties)
{
properties.Cancel = false;
}
Как подсказывает тот же SDK, переменная properties содержит 2 важных, особенно для ItemUpdating, свойства — AfterProperties и BeforeProperties.
Но самое интересное, что эти 2 свойства работаю совсем не так, как ожидается.
Для AfterProperties справедливо следующее:
1. properties.AfterProperties.ChangedProperties.Count всегда равно 0
2. AfterProperties содержит в себе все поля элемента, вне зависимости от того, менялись они или нет. Доступ к ним производится через операцию взятие индекса ([]), н-р properties.AfterProperties["Title"]
Для BeforeProperties справделиво только одно — оно всегда пустое. Не равно null, а просто пустое. Т.е. не содержит никаких полей.
В связи с этой особенностью, если есть необходимость сравнивать значения до изменения и после, нужно сравнивать properties.AfterProperties["имя_поля"] (это значение после изменения) и properties.ListItem["имя_поля"] (это будет значение до изменения)
PS Данное замечание спаведливо для типов содержимого списоков и самих списков. В библиотеке документов и типов содержимого основанных на документах дело обстоит иначе.
PS2 Тоже интересная ссылка по теме (ENG) http://www.sharepoint-tips.com/2006/08/bad-news-synchronous-list-events-bug.html
Реклама
Спасибо!