Pergunta

Estou tentando fazer algum tratamento após criar um item, mas o tratamento é feito duas vezes porque no meu código, após criar o item, estou atualizando-o, para que o receptor do evento seja acionado duas vezes:primeiro quando adiciono o elemento e o segundo quando o atualizo.Aqui está o código:

if (Mode == OperationMode.New)
{
    item = ListeActions.AddItem();
    item["Client"] = new SPFieldLookupValue(myClient.ID, myClient["Name"] as string).ToString();
    //the Event Reciever ItemAdded is fired here
}
if (Mode == OperationMode.Edit)
{
    item = ListeActions.GetItemById(ActionItemID);
}
TextField ACObject = (TextField)Page.GetControlById("ACObjectID");
UserField ACAssignedTo = (UserField)Page.GetControlById("ACAssignedToID");
NoteField ACDetails = (NoteField)Page.GetControlById("ACDetailsID");

item["Object"] = ACObject.Value;
item["AssignedTo"] = ACAssignedTo.Value;
item["Details"] = ACDetails.Value;

item.Update(); 
//if we're in the case of adding new item then the event
//reciever ItemAdded is fired here for the second time
//while ItemUpdated is not fired

Então, como posso interromper o segundo incêndio de itemAdded resultante em item.Update() e ainda manter o primeiro incêndio, pois preciso continuar aplicando meu tratamento?

PS:no caso de atualizar um ListeActions.item existente, o itemUpdated também é acionado duas vezes!!

POR FALAR NISSO :Este código não está escrito no método itemadded nem no método itemupdated, na verdade é o código em um controle de usuário para desenvolvimento de webpart.

Foi útil?

Solução

Você provavelmente tem seu receptor de eventos registrado duas vezes.Use o PowerShell para descobrir.

$site = Get-SPSite http://myportal.com
$web = $site.OpenWeb("/path/to/my/site")
$list = $web.Lists["The List"]
$list.EventReceivers | Select Type, Class | Order Type, Class

Outras dicas

Desative o disparo de eventos antes de atualizar seu item.

this.EventFiringEnabled = false;
item.Update();
this.EventFiringEnabled = true;

Observe que isso pode causar problemas quando item.Update() lança uma exceção, deixando o disparo do evento desativado.você pode usar um try/catch para resolver isso.

espero poder ajudar:)

Posso saber onde esse código específico foi escrito?está em ItemUpdated() ou ItemAdded().Há diferença entre estes Dois.Em ItemAdded(), o receptor de eventos será acionado somente quando o novo item for adicionado ao ItemUpdated(), o receptor de eventos será demitido sempre que o item for atualizado, não importa como você pode vezes quando você atualizar.Também eu sugiro que você faça as seguintes coisas.

Em ItemAdded ou ItemUpdated você pode encontrar este código disponível por padrão.

       base.ItemUpdated(properties);
       base.ItemUpdating(properties);
       base.EventFiringEnabled = false;

Comente este código e para atualização use o seguinte método e não use

item.Atualizar();diretamente.

Em vez disso, use o seguinte método para atualização.

           base.EventFiringEnabled = false;
           try
           {
               contractlistitem.SystemUpdate(false);
           }
           finally
           {
               base.EventFiringEnabled = true;
           }

Obrigado

Por esta,

Você precisa definir o escopo de feature = Web e também definir o escopo em Feature.Template.XML.

Você pode ver a solução aqui.http://asharepointsolutions.blogspot.in/2014/10/sharepoint-event-handler-firing-twice.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top