Pregunta

Estoy tratando de hacer un tratamiento después de crear un artículo, pero el tratamiento se realiza dos veces porque en mi código después de crear el artículo, lo estoy actualizando, por lo que el receptor de eventos se dispara dos veces: primero cuando agrego el elementoY el segundo cuando lo actualicé. Aquí está el 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

Entonces, ¿cómo puedo detener el segundo incendio de los artículos resultantes resultantes en el artículo.Update () sin embargo, mantener el primer incendio ya que necesito seguir aplicando mi tratamiento?

PS: En el caso de actualizar una lista existentes. ¿El elemento, se enciende dos veces también!

BTW: Este código no está escrito en el método ItemAgred, ni en el método itemupDated, en realidad es el código en un control de usuario para un desarrollo de WebPart.

¿Fue útil?

Solución

Probablemente tenga su receptor de eventos registrado dos veces.Usa PowerShell para averiguarlo.

$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

Otros consejos

Desactivar el despido de eventos antes de actualizar su artículo.

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

Tenga en cuenta que esto podría causar problemas cuando el artículo .Update () lanza una excepción, dejando su evento Firing Off. Puede usar un intento / captura para resolver esto.

Espero poder ayudar :)

¿Puedo saber dónde se escribió este código en particular?Es en itemupDated () o ItemAdDed ().Hay diferencia entre estos dos.En el artículo (), el receptor de eventos se disparará solo cuando se agregue el nuevo elemento en el itemupDate () el receptor de eventos Se disparará cada vez que el artículo se actualice, sin importar la forma en que pueda actualizar.También te sugiero que hagas las siguientes cosas.

OTS en ItemAgred o ItemUTDated Puede encontrar este código disponible de forma predeterminada.

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

Comentar estos códigos y para actualizar Use el siguiente método y no use

item.update ();directamente.

Utilice el siguiente método para actualizar.

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

gracias

para esto,

Debe establecer el alcance de la función= web, así como usted, debe configurar el alcance en Feature.template.xml también.

Puedes ver la solución aquí. http://asharepointsolutions.blogspot.in/2014/10/Sharepoint-Event-Handler-Firing-twice.html

Licenciado bajo: CC-BY-SA con atribución
scroll top