Tratamento de evento ItemUpdating receptor de disparar mais de uma vez
-
29-09-2020 - |
Pergunta
A razão pela qual item de atualização do receptor de evento é acionado duas vezes em caso de bibliotecas de documentos é porque de check-in/check-out.
Também pode disparar duas vezes em caso de doc biblioteca/lista se estamos atualizando o item atual com valores neste item a atualização do evento.
Como podemos lidar com ambas as situações, através de código?
Solução
Para o cenário quando você acionar o segundo ItemUpdating
alterando valores de item você pode usar o EventFiringEnabled
parâmetro (você deve usar um try - catch -finally
em torno dele):
this.EventFiringEnabled = false;
// Do the changes
item.Update();
this.EventFiringEnabled = true;
O outro cenário é mais difícil, e a razão por trás de eu usar ItemUpdated
em vez disso, sempre que possível!
Você pode verificar o BeforeProperties
, ListItem
e AfterProperties
em seu ItemUpdating
receptor de eventos para verificar se há atualizações que estão sendo feitas que você tem que agir.Se não, em seguida, basta return
.
Aqui está um guia para quando você pode usar .BeforeProperties
e quando você deve ir no .ListItem
em vez disso
Outras dicas
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 sobre o antes de propriedades, sim, o seu direito que seria o mesmo, independentemente....única solução possível, que eu posso pensar seria usar esta vez
private bool isCheckin(SPItemEventProperties properties)
{
string BeforeVal = properties.ListItem["vti_sourcecontrolcheckedoutby"];
if (properties.AfterProperties["vti_sourcecontrolcheckedoutby"] == null
&& BeforeVal != null)
{
return true;
}
return false;
}