Установка поля SPListItem в ItemUpdating не сохраняется с SystemUpdate (false) - PullRequest
1 голос
/ 23 февраля 2012

У меня есть собственное определение списка с получателем событий, которое переопределяет ItemUpdating.В списке включено одобрение содержимого , наряду с создание основных и вспомогательных версий .

Если элемент утверждается, я хочу установить логическое поле (Опубликован?), Не затрагивая версию и статус утверждения.Я понимаю, SystemUpdate (false) предполагается сделать это, однако он не сохраняет значение bool.Если я использую Update () или SystemUpdate () , значение сохраняется, но оно не устанавливает статус утверждения на Approved и выдает следующую ошибку:

Файл [имя файла] был изменен [user] в [date].

public override void ItemUpdating(SPItemEventProperties properties)
{
    base.ItemUpdating(properties);
    EventFiringEnabled = false;
    try
    {
        if (IsChangingToApproved(properties))
        {    
            if (!Validate(properties))
            {// This person can't approve
                properties.ErrorMessage = "You don't have appropriate permissions.";
                properties.Status = SPEventReceiverStatus.CancelWithError;
                properties.Cancel = true;
            }
            else
            {// Set the IsPublished flag to true                        
                var isPublishedField = properties.List.Fields["Is Published?"];
                if (isPublishedField != null)
                {
                    properties.ListItem[isPublishedField.InternalName] = true;

                    // Doesn't update bool, ItemUpdating event functions normally
                    properties.ListItem.SystemUpdate(false); 

                    // Updates bool, but ItemUpdating event does not complete
                    //properties.ListItem.Update(); 
                    //properties.ListItem.SystemUpdate();

                }
            }
        }
    }
    catch (Exception ex) { return; }
    finally { EventFiringEnabled = true; }
}

Что я пробовал:

  • Обновление listItem с помощью блока using Site/using Web вместо обновления элемента из свойств.
  • Установка свойств.AfterProperties [«Опубликовано?»] Поле.

1 Ответ

2 голосов
/ 23 февраля 2012

Вы не должны вызывать обновление системы внутри вашего синхронного события. Событие без добавления дополнительной версии.

Если вы хотите обновить свойство до обновления, вы можете изменить afterProperties [""], и оно будет сохранено в случае успешного обновления.

base.ItemUpdating(properties);
properties.AfterProperties["Is Published"] = true;

Кстати, вы также можете получить состояние публикации, используя ListItem.ModerationInformation.Status == SPModerationStatusType.Approved (= опубликовано и утверждено)

Опора на внутреннее поле ootb гарантирует, что вам не придется связываться с дополнительными получателями событий (обратите внимание на такие забавные вещи, как при развертывании контента ...), и гарантирует, что статус всегда будет уточненный.

Надеюсь, это помогло.

...