Il modello ad oggetti di SharePoint 2010 vede una novità per quanto riguarda la classe SPEventReceiverStatus. Tale classe definisce lo stato di un event handler e permette di scegliere se la sua computazione deve continuare, se deve stopparsi lasciando all'utente un errore o se deve stopparsi "in silenzio" diciamo, quindi senza eseguire alcuna operazione sull'interfaccia grafica.
Oltre a questi comportamenti, nella nuova versione del prodotto di collaborazione Microsoft, è stato aggiunto quello di poter decidere di stoppare l'evento e redirezionare l'utente su una particolare pagina (diversa quindi dalla solita pagina "errors.aspx"), così da offrire una grafica personalizzata per il messaggio d'errore o per qualsiasi altro tipo di personalizzazione.
Questo comportamento è definito dal valore CancelWithRedirectUrl e, come per gli altri, può essere utilizzato solamente all'interno di eventi di tipo sincroni (quindi tutti quelli che finiscono con "ing", per intenderci), che sono gli unici la cui computazione può essere stoppata.

Enum SPEventReceiverStatus

Vediamo quindi, che all'interno di un gestore d'evento di tipo ItemDeleting, possiamo scegliere di stoppare la cancellazione dell'elemento (proprio come abbiamo sempre fatto in MOSS 2007) e redirezionare l'utente su una pagina d'errore personalizzata.
Per farlo, dobbiamo settare le proprietà Status e RedirectUrl della classe SPItemEventReceiver:

namespace PeppeDotNet.SP2010.RedirectEventReceiver

{
public class RedirectReceiver : SPItemEventReceiver
{
public override void ItemDeleting(SPItemEventProperties properties)
{
base.ItemDeleting(properties);
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/PeppeDotNet.SP2010/DeleteMessage.aspx";
}
}
}

In questo esempio, con due righe di codice è stato possibile effettuare un redirect su una application page custom, posta sotto la directory "LAYOUTS". Su questa pagina è stato inserito il testo d'errore personalizzato e un pulsante per ritornare alla pagina chiamante (che utilizza il valore preso dalla querystring "Source", valore inserito in automatico dall'handler una volta che effettua il redirect).

<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">

You cannot delete this element ! why ?<br />
Visit <a href="http://www.peppedotnet.it">www.peppedotnet.it</a> first.. :)
<br /><br />
<a href='<%= Request.QueryString["Source"] %>'>Go back</a>
</asp:Content>

<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
ERROR
</asp:Content>

<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" >
ERROR
</asp:Content>

Ed ecco il risultato:

Cancellazione di un elemento

Pagina d'errore custom

Così facendo, possiamo effettuare delle azioni custom a fronte di una delle operazioni che l'utente finale può fare sugli elementi di una lista SharePoint 2010 ed effettuare un redirect su un secondo contesto personalizzato.
In MOSS 2007 era possibile, con qualche trucco, effettuare un redirect all'interno di un event handler, ma così come l'han fatto è decisamente molto ma molto più pulito.
Forte no ? :)