Programmgesteuertes Implementieren von Clientrückrufen ohne Postbacks in ASP.NET-Webseiten

Aktualisiert: November 2007

Im Standardmodell für ASP.NET-Webseiten interagiert der Benutzer mit einer Seite und klickt auf eine Schaltfläche bzw. führt eine andere Aktion aus, die zu einem Postback führt. Die Seite und ihre Steuerelemente werden neu erstellt, der Seitencode wird auf dem Server ausgeführt, und eine neue Version der Seite wird an den Browser übergeben. In einigen Situationen ist es jedoch nützlich, den Servercode vom Client auszuführen, ohne dass ein Postback ausgeführt wird. Wenn das Clientskript der Seite einige Zustandsinformationen verwaltet (z. B. Werte lokaler Variablen), wird dieser Zustand durch das Senden der Seite und das Erhalten einer neuen Kopie der Seite zerstört. Zusätzlich führt das Rücksenden von Seiten zu mehr Verarbeitungsaufwand, der die Leistung verringern kann und den Benutzer zum Warten zwingt, bis die Seite verarbeitet und neu erstellt wurde.

Damit der Clientzustand nicht verloren geht und kein zusätzlicher Verarbeitungsaufwand durch einen Serverroundtrip entsteht, können Sie eine ASP.NET-Webseite so programmieren, dass sie Clientrückrufe durchführen kann. Bei einem Clientrückruf sendet eine Clientskriptfunktion eine Anforderung an eine ASP.NET-Webseite. Die Webseite führt eine geänderte Version ihres normalen Lebenszyklus aus. Die Seite wird initiiert, ihre Steuerelemente und anderen Member werden erstellt, und dann wird eine speziell gekennzeichnete Methode aufgerufen. Die Methode führt die Verarbeitung durch, die Sie programmiert haben, und gibt dann dem Browser einen Wert zurück, der von einer anderen Clientskriptfunktion gelesen werden kann. Während dieses Prozesses ist die Seite im Browser dynamisch.

Eine Reihe von Webserversteuerelementen können Clientrückrufe verwenden. Beispielsweise verwendet das TreeView-Steuerelement Clientrückrufe, um die Funktion zum bedarfsgerechten Auffüllen von Knoten zu implementieren. Weitere Informationen finden Sie unter Übersicht über das TreeView-Webserversteuerelement.

Es gibt mehrere Möglichkeiten, Clientrückrufe auf einer ASP.NET-Webseite zu automatisieren. AJAX-Features in ASP.NET wie das UpdatePanel-Steuerelement können für Sie asynchrone Teilaktualisierungen von Seiten automatisieren, und die Webdienst-Kommunikationsfunktion kann asynchrone Webdienstaufrufe automatisieren.

Eine Übersicht über AJAX-Features in ASP.NET, die Clientrückrufe automatisieren können, finden Sie in den folgenden Themen:

Sie können auch ein eigenes Clientskript schreiben, um Clientrückrufe direkt zu implementieren. In diesem Thema wird beschrieben, wie Sie eigene Clientrückrufe für die asynchrone Kommunikation zwischen Client und Server implementieren.

Komponenten der Clientrückrufe

Das Erstellen einer ASP.NET-Seite, die Clientrückrufe programmgesteuert implementiert, entspricht bis auf wenige Unterschiede dem Erstellen von ASP.NET-Seiten. Der Servercode der Seite muss die folgenden Aufgaben ausführen:

  • Implementieren Sie die ICallbackEventHandler-Schnittstelle. Sie können diese Schnittstellendeklaration jeder ASP.NET-Webseite hinzufügen.

  • Stellen Sie eine Implementierung der RaiseCallbackEvent-Methode bereit. Diese Methode wird aufgerufen, um den Rückruf auf dem Server auszuführen.

  • Stellen Sie eine Implementierung der GetCallbackResult-Methode bereit. Diese Methode gibt das Rückrufergebnis an den Client zurück.

Außerdem muss die Seite drei Clientskriptfunktionen enthalten, die die folgenden Aktionen ausführen:

  • Eine Funktion ruft eine Hilfsmethode auf, die die eigentliche Anforderung an den Server ausführt. In dieser Funktion können Sie benutzerdefinierte Logik ausführen, um die Ereignisargumente zuerst vorzubereiten. Sie können eine Zeichenfolge als Parameter an den serverseitigen Rückrufereignishandler senden.

  • Eine andere Funktion erhält das Ergebnis vom Servercode, der das Rückrufereignis verarbeitet hat, bzw. wird von diesem Ergebnis aufgerufen. Dazu nimmt die Funktion die Zeichenfolge an, die die Ergebnisse darstellt. Dies wird als Clientrückruffunktion bezeichnet.

  • Die dritte Funktion ist die Hilfsfunktion, die die eigentliche Anfrage an den Server sendet. Diese Funktion wird von ASP.NET automatisch erstellt, wenn Sie einen Verweis auf diese Funktion erstellen, indem Sie die GetCallbackEventReference-Methode im Servercode verwenden.

Sowohl Clientrückrufe als auch Postbacks sind Anforderungen an die sendende Seite. Aus diesem Grund werden Clientrückrufe und Postbacks in Webserverprotokollen als Seitenanforderung aufgezeichnet.

Implementieren der erforderlichen Schnittstellen im Servercode

Um Servercode aus dem Clientskript heraus ohne Postback auszuführen, müssen Sie im Servercode mehrere Schnittstellen implementieren.

Deklarieren der ICallbackEventHandler-Schnittstelle

Sie können die ICallbackEventHandler-Schnittstelle als Teil der Klassendeklaration für die Seite deklarieren. Wenn Sie eine Code-Behind-Seite erstellen, können Sie die Schnittstelle mithilfe von Syntax deklarieren, z. B. mit folgender Syntax.

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

Wenn Sie in einer Einzeldateiseite oder einem Benutzersteuerelement arbeiten, können Sie eine Deklaration hinzufügen, indem Sie in der Seite eine @ Implements-Direktive verwenden. Dies ist in den folgenden Beispielen gezeigt:

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

Beim Schnittstellennamen wird die Groß-/Kleinschreibung berücksichtigt.

Erstellen einer Serverrückrufmethode

Im Servercode müssen Sie eine Methode erstellen, die die RaiseCallbackEvent-Methode implementiert, sowie eine Methode, die die GetCallbackResult-Methode implementiert. Die RaiseCallbackEvent-Methode akzeptiert ein einzelnes Zeichenfolgenargument anstatt der üblichen zwei Argumente, die i. d. R. mit Ereignishandlern verwendet werden. Ein Teil der Methode kann z. B. wie das folgende Beispiel aussehen:

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

End Sub
public void RaiseCallbackEvent(String eventArgument)
{

}

Die GetCallbackResult-Methode akzeptiert keine Argumente und gibt eine Zeichenfolge zurück. Ein Teil der Methode kann z. B. wie das folgende Beispiel aussehen:

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

Erstellen von Clientskriptfunktionen

Sie müssen der Seite Clientskriptfunktionen hinzufügen, um die folgenden zwei Funktionen auszuführen: Senden des Rückrufs an die Serverseite und Empfangen der Ergebnisse. Beide Clientskriptfunktionen sind in ECMAScript (JavaScript) geschrieben.

Senden des Rückrufs

Die Funktion zum Senden des Rückrufs wird im Servercode generiert. Der eigentliche Rückruf wird von einer Bibliotheksfunktion ausgeführt, die jeder Seite zur Verfügung steht, die die ICallbackEventHandler-Schnittstelle implementiert. Sie können einen Verweis auf die Bibliotheksfunktion abrufen, indem Sie die GetCallbackEventReference-Methode der Seite aufrufen. Der Zugriff auf die Methode erfolgt über die ClientScript-Eigenschaft der Seite. Sie erstellen dann dynamisch eine Clientfunktion, die einen Aufruf des Rückgabewerts der GetCallbackEventReference-Methode umfasst. Sie übergeben an diese Methode einen Verweis auf die Seite (this in C# oder Me in Visual Basic), den Namen des Arguments, mit dem Sie die Daten übergeben möchten, den Namen der Clientskriptfunktion, die die Rückrufdaten erhält, und ein Argument, das jeden von Ihnen gewünschten Kontext übergibt.

Wenn Sie die Funktion erstellt haben, fügen Sie sie in die Seite ein, indem Sie die RegisterClientScriptBlock-Methode aufrufen.

Das folgende Beispiel zeigt, wie Sie auf dynamische Weise eine Funktion mit dem Namen CallServer erstellen, die den Rückruf aufruft.

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);
}

Die Namen der Argumente, die die generierte Funktion akzeptiert, muss mit den Namen der Werte übereinstimmen, die Sie an die GetCallbackEventReference-Methode übergeben.

Das folgende Beispiel zeigt Markup, das Sie verwenden können, um den Rückruf aufzurufen und dessen Rückgabewert zu verarbeiten:

<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>

Empfangen des Rückrufs

Sie können die Clientfunktion schreiben, die Rückrufe statisch in der Seite empfängt. Die Funktion muss den gleichen Namen aufweisen, den Sie im Aufruf der GetCallbackEventReference-Methode übergeben. Die empfangende Funktion nimmt zwei Zeichenfolgewerte entgegen: einen für den Rückgabewert und einen zweiten optionalen Wert für den Kontextwert, der vom Server zurückgegeben wird.

Die Funktion kann z. B. folgendermaßen aussehen:

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

Siehe auch

Konzepte

Beispiel für das Implementieren von Clientrückrufen (Visual Basic)

Beispielimplementierung eines Clientrückrufs (C#)

Referenz

ClientScriptManager