Как получить в настоящее время добавление элемента в SPList из SPItemEventProperties внутри обработчика событий? - PullRequest
3 голосов
/ 14 мая 2010

Я использую ItemAdding Event для одного из моих SPList. Вопрос в том, как я могу получить новый, еще не добавленный элемент из SPItemEventProperties? Я пытался ListItem.Item, но отладчик показывает, что для свойства установлено значение Nothing. Любая поправка предложить?

С наилучшими пожеланиями

T.S.

Ответы [ 2 ]

4 голосов
/ 14 мая 2010

Ihe Событие ItemAdding запускает до того, как добавлено записанное, поэтому вы не можете получить доступ к полям с помощью .Item.

Однако вы можете получить доступ ко всему, кроме ID (поскольку он еще не создан) в хеш-таблице .AfterProperties .

Хороший пример кода

2 голосов
/ 14 мая 2010

Прежде всего, это зависит от того, работает ли ваш приемник событий в Списке или Библиотеке документов.

Проверьте этот сайт на удобные таблицы, когда 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";
}

Я надеюсь, что этот пост даст вам лучшее представление о том, как до и после событий работают как для списков, так и для библиотек. Ваши комментарии и отзывы всегда приветствуются.

...