não pode cancelar a eliminação na lista de eventos item método receptor ItemDeleting em CMSPUBLISHINGSITE # 2
-
18-09-2019 - |
Pergunta
Usando o SharePoint 2010 RC Estou tendo problemas a cancelar a exclusão de um item da lista usando receptores de eventos. Meu código está disparando, definindo a propriedade dos SPItemEventProperties cancelar, definindo uma mensagem de erro, e lançar uma volta de erro para o segmento chamado. Esta abordagem funciona bem na adição / actualização dos métodos, no entanto, quando utilizada no método de exclusão posso assistir o fogo código em um depurador, mas o item ainda é movido para lixeira do site.
Além disso, eu estou vendo esse comportamento em um site criado a partir do "CMSPUBLISHINGSITE # 2" modelo a partir de stsadm, mas não a partir de um site criado a partir do "Team Site" template via Administração Central.
O código de mau comportamento a seguir:
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;
}
}
}
Para referência, código idêntico está contida no método ItemAdding e funciona como esperado.
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;
}
}
}
Solução
Eu recomendo que você não estar usando exceções como parte de sua lógica de negócio. Exceções são caros e só deve ser usado em casos excepcionais que não são tratados pela lógica normal.
Em vez disso, use algo como isto:
public override void ItemDeleting(SPItemEventProperties properties)
{
if (properties.UserLoginName.ToLower().CompareTo("sharepoint\\system") != 0)
{
properties.Cancel = true;
properties.ErrorMessage = "Some error has occured....";
}
}
E, por falar nisso, você está lançando uma exceção adicional dentro do manipulador de eventos que provavelmente é a razão que você vê este comportamento que você está enfrentando.