2009-12-03 2 views
2

У меня есть приемник событий, когда обновляется элемент списка (ItemUpdated, а не ItemUpdating). Внутри получателя я снова обновляю элемент списка. Это, естественно, вызывает некоторые рекурсивные вызовы событий, как я ожидал. Поставив точку останова в начале обработчика события, я считаю, что это прерывание в событии 10 раз, а затем оно просто заканчивается. Возможно ли какая-то защита рекурсии внутри SharePoint именно для защиты от такого рода вещей?Рекурсивные обработчики событий SharePoint

ответ

-2

Или используйте item.SystemUpdate(), SystemUpdate делает обновление, не вызывая какое-либо событие, прикрепленное к элементу.

+0

Оба являются хорошими ответами, но ваше решение немного чище. Cheers –

+0

Я использую оба эти вместе. У меня были случаи, когда SystemUpdate не остановил рекурсию, не имея также DisableEventFiring. И даже мы используем DisableEventFiring, я также вызываю SystemUpdate (false), потому что я не хочу изменять Modify By или Item Version из Event Receiver. –

+3

-1. Это НЕ ТОЧНО, SystemUpdate() - непрозрачный метод, реализация которого вы не знаете, он только документально обновляется без изменения изменений в полях Модифицированное время или Модифицированное Поля или, при необходимости, версии элемента. Он используется внутри компании SharePoint для таких вещей, как форумы для дискуссий, где вы не хотите изменять оригинального автора сообщения и т. Д. События срабатывают, на самом деле функциональность, на которую вы сейчас полагаетесь, для прекращения распространения события был почти почти изменен в SharePoint 2010 и может в будущем. – mjsabby

12

Используйте DisableEventFiring метод

base.DisableEventFiring(); 
item.update(); 
base.EnableEventFiring();

+1

Это единственный * правильный * способ сделать это в SharePoint 2007, и EventFiringEnabled = истина/ложь; это ТОЛЬКО * правильный * способ сделать это в SharePoint 2010. – mjsabby

1

Еще более безопасный подход:

try { 
    this.DisableEventFiring(); 
    item.SystemUpdate(); // or item.Update(); or item.UpdateOverwriteVersion(); 
} finally { 
    this.EnableEventFiring(); 
} 

Только в случае, если ваш звонок обновление не по какой-то причине.

0

Современный способ (не depricated):

EventFiringEnabled = false; 
item.Update(); 
EventFiringEnabled = true; 
Смежные вопросы