Condividi tramite


Implementazione di callback client a livello di codice senza postback nelle pagine Web ASP.NET

Aggiornamento: novembre 2007

Nel modello predefinito per le pagine Web ASP.NET, l'utente interagisce con una pagina e fa clic su un pulsante o esegue un'altra azione che genera un postback. La pagina e i suoi controlli vengono ricreati, il codice della pagina viene eseguito sul server e viene effettuato il rendering di una nuova versione della pagina sul browser. In alcuni casi, tuttavia, è utile eseguire il codice lato server sul client senza effettuare un postback. Se lo script client nella pagina provvede a gestire informazioni relative allo stato, come, ad esempio, valori di variabili locali, lo stato associato a tali informazioni verrà eliminato in modo permanente al momento dell'invio della pagina e della ricezione di una nuova copia di questa. Inoltre, il postback delle pagine provoca un sovraccarico di elaborazione che può influenzare negativamente le prestazioni e aumentare i tempi di attesa legati all'elaborazione e alla creazione delle pagine.

Per evitare la perdita di informazioni sullo stato sul lato client e il sovraccarico di elaborazione associato alla sequenza di andata e ritorno fra client e server, è possibile codificare una pagina Web ASP.NET in modo che possa eseguire dei callback client. In un callback client, una funzione script client invia una richiesta a una pagina Web ASP.NET. Tale pagina esegue una versione modificata del proprio ciclo di vita normale. La pagina viene avviata i controlli e gli altri membri vengono creati, quindi viene richiamato un metodo contrassegnato in modo speciale. Tale metodo esegue l'elaborazione codificata dallo sviluppatore e restituisce al browser un valore che può essere letto da un'altra funzione script client. Durante questo processo, sul browser la pagina rimane attiva.

Diversi controlli server Web possono utilizzare i callback client. Ad esempio, il controllo TreeView utilizza callback client per implementare la propria funzionalità di popolamento su richiesta. Per ulteriori informazioni, vedere Cenni preliminari sul controllo server Web TreeView.

Vi sono molte opzioni per l'automatizzazione dei callback client in una pagina Web ASP.NET. Le funzionalità AJAX di ASP.NET, ad esempio il controllo server UpdatePanel, possono automatizzare gli aggiornamenti parziali di pagina asincroni, mentre la funzionalità di comunicazione dei servizi Web può automatizzare chiamate di servizi Web asincrone.

Per i cenni preliminari sulle funzionalità AJAX in ASP.NET che automatizzano i callback client, vedere i seguenti argomenti:

È inoltre possibile scrivere script client per implementare direttamente i callback client. In questo argomento viene illustrato come implementare i callback client per la comunicazione asincrona tra il client e il server.

Componenti di callback client

La creazione di una pagina ASP.NET che implementi a livello di codice callback client è simile alla creazione di qualsiasi pagina ASP.NET, con alcune differenze. Il codice server della pagina deve eseguire le attività seguenti:

  • Implementare l'interfaccia ICallbackEventHandler. È possibile aggiungere questa dichiarazione di interfaccia a qualsiasi pagina Web ASP.NET.

  • Fornire un'implementazione per il metodo RaiseCallbackEvent. Questo metodo verrà richiamato per eseguire il callback nel server.

  • Fornire un'implementazione per il metodo GetCallbackResult. Questo metodo restituirà il risultato del callback al client.

Inoltre, la pagina deve contenere tre funzioni script client che eseguano le azioni riportate di seguito.

  • Una funzione chiama un metodo di supporto che esegue la richiesta effettiva al server. In questa funzione, è possibile eseguire la logica personalizzata per preparare gli argomenti dell'evento. È possibile inviare una stringa come parametro al gestore eventi di callback lato server.

  • Un'altra funzione riceve il risultato del codice lato server che ha elaborato l'evento callback, ovvero viene chiamata da tale codice. Questa funzione accetta una stringa che rappresenta i risultati. È denominata funzione di callback client.

  • Una terza funzione è la funzione di supporto che esegue la richiesta effettiva al server. Questa funzione è generata automaticamente da ASP.NET quando si genera un riferimento a questa funzione utilizzando il metodo GetCallbackEventReference nel codice lato server.

Sia i callback che i postback client sono richieste per la pagina di origine. Pertanto, i callback e i postback client sono registrati nei log server Web come richieste di pagina.

Implementazione delle interfacce necessarie nel codice lato server

Per eseguire il codice lato server dallo script client senza postback, è necessario implementare varie interfacce nel codice lato server.

Dichiarazione dell'interfaccia ICallbackEventHandler

È possibile dichiarare l'interfaccia ICallbackEventHandler come parte della dichiarazione di classe per la pagina. Durante la creazione di una pagina code-behind, è possibile dichiarare l'interfaccia utilizzando, ad esempio, la sintassi riportata di seguito.

Partial Class CallBack_DB_aspx
    Inherits System.Web.UI.Page
    Implements System.Web.UI.ICallbackEventHandler
public partial class CallBack_DB_aspx : 
    System.Web.UI.Page, System.Web.UI.ICallbackEventHandler

Se si sta utilizzando una pagina a file singolo o un controllo utente, è possibile aggiungere la dichiarazione utilizzando una direttiva @ Implements nella pagina, come illustrato negli esempi riportati di seguito:

<%@ Page Language="VB" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
Nota:

Per il nome dell'interfaccia viene applicata la distinzione tra maiuscole e minuscole.

Creazione di un metodo callback server

Nel codice lato server è necessario creare un metodo che implementi il metodo RaiseCallbackEvent e un metodo che implementi il metodo GetCallbackResult. Il metodo RaiseCallbackEvent accetta un solo argomento stringa anziché i soliti due argomenti che vengono generalmente utilizzati con i gestori eventi. Di seguito viene riportato un esempio di una porzione di questo metodo:

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
    Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

End Sub
public void RaiseCallbackEvent(String eventArgument)
{

}

Il metodo GetCallbackResult non accetta argomenti e restituisce una stringa. Di seguito viene riportato un esempio di una porzione di questo metodo:

Public Function GetCallbackResult() As String Implements _
    System.Web.UI.ICallbackEventHandler.GetCallbackResult
    Return aStringValue
End Function
public string GetCallbackResult()
{
    return aStringValue;
}

Creazione di funzioni script client

È necessario aggiungere le funzioni script client alla pagina per eseguire due funzioni: l'invio del callback alla pagina sul server e la ricezione dei risultati. Per entrambe le funzioni script client è necessario utilizzare un linguaggio ECMAScript (JavaScript).

Invio del callback

La funzione di invio del callback è generata dal codice lato server. Il callback effettivo viene eseguito da una funzione di libreria disponibile per tutte le pagine che implementano l'interfaccia ICallbackEventHandler. È possibile ottenere un riferimento alla funzione di libreria chiamando il metodo GetCallbackEventReference della pagina. È possibile accedere a tale metodo tramite la proprietà ClientScript della pagina. È quindi possibile compilare in modo dinamico una funzione client che includa una chiamata al valore restituito dal metodo GetCallbackEventReference. A tale metodo viene passato un riferimento alla pagina (this in C# o Me in Visual Basic), il nome dell'argomento che verrà utilizzato per passare i dati, il nome della funzione script client che riceverà i dati del callback, nonché un argomento da utilizzare per passare eventuali informazioni sul contesto.

Una volta compilata la funzione, questa viene inserita nella pagina tramite una chiamata al metodo RegisterClientScriptBlock.

Nell'esempio riportato di seguito viene illustrato come creare in modo dinamico una funzione denominata CallServer che richiama il callback.

Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Me.Load
    Dim cm As ClientScriptManager = Page.ClientScript
    Dim cbReference As String
    cbReference = cm.GetCallbackEventReference(Me, "arg", _
        "ReceiveServerData", "")
    Dim callbackScript As String = ""
    callbackScript &= "function CallServer(arg, context)" & _
        "{" & cbReference & "; }"
    cm.RegisterClientScriptBlock(Me.GetType(), _
        "CallServer", callbackScript, True)End Sub
void Page_Load(object sender, EventArgs e)
{
    ClientScriptManager cm = Page.ClientScript;
    String cbReference = cm.GetCallbackEventReference(this, "arg",
        "ReceiveServerData", "");
    String callbackScript = "function CallServer(arg, context) {" +
        cbReference + "; }";
    cm.RegisterClientScriptBlock(this.GetType(),
        "CallServer", callbackScript, true);
}

I nomi degli argomenti accettati dalla funzione che si sta generando devono corrispondere ai nomi dei valori passati al metodo GetCallbackEventReference.

Nell'esempio riportato di seguito viene illustrato il markup che potrebbe essere utilizzato per richiamare il callback ed elaborare il valore restituito:

<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>
<input type="button" value="Callback" 
    onclick="CallServer(1, alert('Callback'))"/>
<br />
<span id="Message"></span>

Ricezione del callback

È possibile scrivere la funzione client che riceve i callback in modo statico sulla pagina. Tale funzione deve essere denominata in modo da corrispondere al nome passato nella chiamata al metodo GetCallbackEventReference. La funzione di ricezione accetta due valori di tipo stringa: uno per il valore restituito e un secondo, facoltativo, che riceve un valore relativo al contesto restituito dal server.

Di seguito è riportato un esempio in cui viene illustrata questa funzione:

<script type="text/javascript">
function ReceiveServerData(arg, context)
{
    Message.innerText = 'Processed callback.';
}
</script>

Vedere anche

Concetti

Esempio di implementazione di callback client (Visual Basic)

Esempio di implementazione di callback client (C#)

Riferimenti

ClientScriptManager