Обработка приемника событий ItemUpdating, запускающего более одного раза
-
29-09-2020 - |
Вопрос
Причина, по которой приемник событий обновления элементов срабатывает дважды в случае библиотек документов, связана с возвратом/извлечением.
Также он может срабатывать дважды в случае библиотеки/списка документов, если мы обновляем текущие значения элемента в этом событии обновления элемента.
Как мы можем справиться с обоими этими случаями с помощью кода?
Решение
Для сценария, когда вы запускаете второй ItemUpdating
изменяя значения элементов, вы можете использовать EventFiringEnabled
параметр (вы должны использовать try - catch -finally
вокруг него):
this.EventFiringEnabled = false;
// Do the changes
item.Update();
this.EventFiringEnabled = true;
Другой сценарий сложнее, и причина, по которой я использую ItemUpdated
вместо этого, когда это возможно!
Вы можете проверить BeforeProperties
, ListItem
и AfterProperties
в вашей ItemUpdating
приемник событий, чтобы проверить наличие обновлений, над которыми вам необходимо принять меры.Если нет, то просто return
.
Вот руководство когда ты сможешь использовать .BeforeProperties
и когда вам следует зайти в .ListItem
вместо
Другие советы
public override void ItemUpdating(SPItemEventProperties properties)
{
try
{
//is the item checked out?
if (isCheckin(properties) == false)
{
this.EventFiringEnabled = false;
//do your stuff
}
}
catch(Exception a)
{
//catch any errors
}
finally
{
this.EventFiringEnabled = true;
}
}
private bool isCheckin(SPItemEventProperties properties)
{
if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null
&& properties.BeforeProperties["vti_sourcecontrolcheckedoutby"] != null)
{
return true;
}
return false;
}
.
@Robert о том, как перед свойствами, да, вы правы они были бы одинаковыми, независимо от .... Только возможное решение, которое я могу придумать, будет использовать это вместо этого
private bool isCheckin(SPItemEventProperties properties)
{
string BeforeVal = properties.ListItem["vti_sourcecontrolcheckedoutby"];
if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null
&& BeforeVal != null)
{
return true;
}
return false;
}
.