Non è possibile annullare l'eliminazione nella voce di elenco ricevitore evento metodo ItemDeleting in CMSPUBLISHINGSITE # 2
-
18-09-2019 - |
Domanda
Uso della RC SharePoint 2010 Ho dei problemi annullando l'eliminazione di un elemento della lista utilizzando i ricevitori di eventi. Il mio codice è sparare, impostando la proprietà dei SPItemEventProperties annullare, impostare un messaggio di errore, e gettando un errore indietro al thread chiamante. Questo approccio funziona bene nei metodi di aggiunta / aggiornamento, tuttavia, se usato nel metodo cancellazione posso guardare il codice del fuoco in un debugger, ma la voce è ancora spostato riciclaggio bin del sito.
Inoltre, sto vedendo questo comportamento in un sito creato dal modello "CMSPUBLISHINGSITE # 2" dal stsadm, ma non da un sito creato dal modello "Sito del team" tramite Amministrazione centrale.
Il codice di comportamento anomalo segue:
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;
}
}
}
Per riferimento, codice identico è contenuto nel metodo ItemAdding e funziona come previsto.
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;
}
}
}
Soluzione
Io vi consiglierei di non essere con eccezioni come parte della vostra logica di business. Le eccezioni sono costosi e devono essere utilizzati solo in casi eccezionali, che non venga gestita da logica normale.
Invece, usare qualcosa di simile a questo:
public override void ItemDeleting(SPItemEventProperties properties)
{
if (properties.UserLoginName.ToLower().CompareTo("sharepoint\\system") != 0)
{
properties.Cancel = true;
properties.ErrorMessage = "Some error has occured....";
}
}
E, a proposito, si sta gettando un'eccezione aggiuntiva all'interno del gestore di eventi che probabilmente è la ragione che si vede questo comportamento si è verificato.