Невозможно отменить удаление в приемнике событий элемента списка. Метод ItemDeleting в CMSPUBLISHINGSITE#2.
-
18-09-2019 - |
Вопрос
При использовании SharePoint 2010 RC у меня возникли проблемы с отменой удаления элемента списка с помощью приемников событий.Мой код срабатывает, устанавливает свойство отмены SPItemEventProperties, устанавливает сообщение об ошибке и возвращает ошибку обратно в вызывающий поток.Этот подход отлично работает в методах добавления/обновления, однако при использовании в методе удаления я могу наблюдать, как код срабатывает в отладчике, но элемент все равно перемещается в корзину сайта.
Кроме того, я наблюдаю такое поведение на сайте, созданном на основе шаблона «CMSPUBLISHINGSITE#2» из stsadm, но не на сайте, созданном на основе шаблона «Сайт группы» через центр администрирования.
Некорректный код следующий:
public override void ItemDeleting(SPItemEventProperties properties)
{
if (!(properties.UserLoginName == "SHAREPOINT\\system"))
{
try
{
throw new CreatorIdAliasingException("Please contact support if you feel a release web site has been inappropriately assigned to your organization.");
}
catch (CreatorIdAliasingException ex)
{
properties.Cancel = true;
properties.ErrorMessage = ex.ToString();
properties.InvalidateListItem();
throw;
}
}
}
Для справки: идентичный код содержится в методе ItemAdding и работает должным образом.
public override void ItemAdding(SPItemEventProperties properties)
{
base.ItemAdding(properties);
if (!(properties.UserLoginName == "SHAREPOINT\\system"))
{
try
{
throw new InvalidCreatorIdException("Please contact support to add a known URL to your list of release web sites.");
}
catch (InvalidCreatorIdException ex)
{
properties.Cancel = true;
properties.ErrorMessage = ex.ToString();
properties.InvalidateListItem();
throw;
}
}
}
Решение
Я бы рекомендовал вам не использовать исключения как часть вашей бизнес-логики.Исключения являются дорогостоящими, и их следует использовать только в исключительных случаях, которые не обрабатываются обычной логикой.
Вместо этого используйте что-то вроде этого:
public override void ItemDeleting(SPItemEventProperties properties)
{
if (properties.UserLoginName.ToLower().CompareTo("sharepoint\\system") != 0)
{
properties.Cancel = true;
properties.ErrorMessage = "Some error has occured....";
}
}
И, кстати, вы генерируете дополнительное исключение в обработчике событий, что, вероятно, и является причиной такого поведения, которое вы испытываете.