Domanda

Sto cercando di fare del trattamento dopo aver creato un oggetto ma il trattamento viene fatto due volte perché nel mio codice dopo aver creato l'oggetto, lo sto aggiornando, quindi l'evento ricevuta viene licenziato due volte: prima quando aggiungo l'elementoe il secondo quando l'ho aggiornato. Ecco il codice:

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
.

Allora, come posso interrompere il secondo incendio di IteBaseddeddeddeding su Item.Update () ma mantieni il primo incendio da quando ho bisogno di continuare ad applicare il mio trattamento?

PS: In caso di aggiornamento di un elenco esistente. Anche la voce ItemUpdated viene licenziata due volte !!

BTW: questo codice non è stato scritto nel metodo ItemAggiunto né nel metodo ItemUpdated, in realtà è il codice in un controllo utente per uno sviluppo WebPart.

È stato utile?

Soluzione

Probabilmente hai ricevuto il ricevitore di eventi due volte.Usa PowerShell per scoprirlo.

$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
.

Altri suggerimenti

Disabilita la sparatura degli eventi prima di aggiornare il tuo articolo.

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

Si noti che ciò potrebbe causare problemi quando Item.Update () lancia un'eccezione, lasciando il tuo eventFiring .. È possibile utilizzare un tentativo / cattura per risolverlo.

Spero di poter aiutare :)

Possa io sapere dov'era scritto questo particolare codice?è su ItemUpdated () o IteRededded ().C'è differenza tra questi Due.In IteRaddded () Il ricevitore dell'evento verrà licenziato solo quando il nuovo elemento viene aggiunto in ItemUpdated () il ricevitore dell'evento Verrà licenziato ogni volta che l'articolo viene aggiornato, non importa su come è possibile ora quando si aggiorna.Inoltre ti suggerisco di fare le seguenti cose.

In ItemAggiunto o ItemUpdated è possibile trovare questo codice disponibile per impostazione predefinita.

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

Commenta questi codi e per l'aggiornamento Utilizzare il seguente metodo e non utilizzare

Item.Update ();direttamente.

Utilizzare invece il seguente metodo per l'aggiornamento.

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

Grazie

Per questo,

È necessario impostare l'ambito della funzione= Web e è necessario impostare l'ambito in funzione.Template.xml anche.

Puoi vedere la soluzione qui. http://asharepollow"> http://asharepollowsolutions.blogspot.in/2014/10/sharepoint-event-handler-firing-twice.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top