Вопрос

Я пытаюсь сделать ваше достопримечательность после создания элемента, но обращение выполняется дважды, потому что в моем коде после создания элемента я обновляю его, поэтому прицел события уволен дважды: сначала, когда я добавляю элементА второй, когда я его обновил. Вот код:

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
.

Так как я могу остановить второй огонь itemAddeddend, что приведет к тому, что oot.update (), но держите первый огонь, поскольку мне нужно продолжать применять мое обращение?

PS: В случае обновления существующих вкладов. Item The Iteupdated уволен дважды !!

BTW: Этот код не записан в ThetAdded Method ни в методе ITEUDUPDATED, на самом деле это код в управлении пользователем для разработки веб-панели.

Это было полезно?

Решение

У вас, вероятно, зарегистрированы ваш приемник событий дважды.Используйте PowerShell, чтобы узнать.

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

Другие советы

Отключить стрельбу события перед обновлением вашего товара.

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

Обратите внимание, что это может вызвать проблемы, когда item.update () бросает исключение, оставляя свой EventFiry Off .. Вы можете использовать попытку / ловить, чтобы решить это.

Надеюсь, я могу помочь :)

Могу ли я знать, где этот конкретный код написан?это на itemupdated () или itemAdded ().Существует разница между этим два.В itemAdded () приемник событий будет уволен только тогда, когда добавляется новый элемент в ItemUpdated () приемник событий Будет уволен всякий раз, когда товар обновляется, независимо от того, как время, когда вы обновляете.Также я предлагаю вам сделать следующие вещи.

либо в itemAdded или itemupdated Вы можете найти этот код доступен по умолчанию.

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

Комментировать этот код и обновление Используйте следующий метод и не используйте

item.update ();напрямую.

вместо этого используйте следующий метод обновления.

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

Спасибо

для этого,

Вам нужно установить объем функции= Web, а также вам нужно установить объем в функции. Template.xml также.

Вы можете увидеть решение здесь. http://asharepointsolutions.blogspot.in/2014/10/sharepoint-event-handler-firing-twice.html

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