Обработка приемника событий ItemUpdating, запускающего более одного раза

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/110929

  •  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;
}
.

https://www.simple-talk.com/dotnet/.net-tools/managing-itemupdating-and-itemupdated-events-firing-twice-in-a-sharepoint-ite-VENT-приемник /

@Robert о том, как перед свойствами, да, вы правы они были бы одинаковыми, независимо от .... Только возможное решение, которое я могу придумать, будет использовать это вместо этого

private bool isCheckin(SPItemEventProperties properties)
{
    string BeforeVal = properties.ListItem["vti_sourcecontrolcheckedoutby"];

    if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null 
         && BeforeVal != null)
    {
        return true;
    }
    return false;
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top