Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Dass mit diversen Techniken clientseitig über Javascript serverseitige Funktionen aufgerufen werden können ist nichts Neues.
Doch welche Technik überzeugt und welche passt am besten? In diesem Artikel werden drei grundlegende Vorgehensweisen erläutert und miteinander verglichen: Das Updatepanel, das Callback und der clientseitige Webservice Aufruf. Dazu gibt es jeweils ein kurzes Beispiel.

Das Updatepanel – Segen oder Fluch?

Immer wieder wird über folgende Wörter gestolpert: „böses Asp.Net Updatepanel…“. Doch warum wird es dann oft verwendet und vor allem: warum ist es böse?
Grundsätzlich entspricht das Updatepanel dem traditionellen Postbackmodell – eine Anforderung ist immer noch ein vollständiges Postback. Das Formular wird inklusive Viewstate an den Server gesendet. Der Großteil des Lebenszyklus der Seite bleibt erhalten und das Rendern bleibt dem Server überlassen.

„Es ist aber immer noch schneller als ein komplettes Postback!“

Das stimmt tatsächlich - der Unterschied und Vorteil liegt also nicht in der Anforderung, sondern in der Antwort des Servers.
Nur bestimmte Teile der Seite bzw. des Viewstates werden zurückgegeben und ausgetauscht (Partielles Rendering).

Update Panel
Fazit:

Diese Variante ist mit Sicherheit die einfachste. Dadurch, dass sich der auszutauschende Inhalt innerhalb eines Containers befindet, kann das UpdatePanel als relativ elegant bezeichnen werden. Allerdings leidet die Performance unter der Datenmenge die von Client zu Server gesendet wird (gesamte Formulardaten inkl. Viewstate). Das UpdatePanel ist nicht clientseitig beeinflussbar und somit auf Serverseitige Steuerung angewiesen. Die Features leiden darunter.

Einfach
Elegant
Performant

Beispiel:

Um die partiellen UpdatePanel Aktualisierungen nutzen zu können muss der Seite ein ScriptManager hinzugefügt werden

<asp:ScriptManager ID="ScriptManager1" runat="server"/>

Die Deklaration des UpdatePanels siehst dann wie folgt aus (mehr Infos gibt es hier)

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Label ID="Message" Text="This is a update panel…" runat="server" />
        <asp:Button ID="Save" Text="Save" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>


Das Callback – Keine Angst, es beißt nicht!

Das Callback ruft Servercode mittels Clientscript auf, ohne dadurch(zwingend) einen Postback zu verursachen. Klingt auf Anhieb super – aber ohne Postback gibt’s auch keine Formular Daten, d.h. die Anforderung besteht aus Parametern die per Javascript manuell angegeben werden.
Wie das Updatepanel nützt auch das Callback das XmlHttp Objekt intern zum Aufruf der Serverseitigen Methoden.
Die gesendeten Daten sind sehr gering. Allerdings wird der Lebenszyklus der Seite normal durchlaufen. Das kann sich bei einer größeren Seite durchaus bemerkbar machen, denn sie wird wie deren Controls und Members normal erstellt.
Rückgabe des Callbacks können per json Serialisierte Daten oder auch normaler HTML Text sein.

Callback

Fazit:

In bestimmten Fällen kann es durchaus Sinn machen, Servercode aufzurufen ohne dadurch ein Postback zu verursachen oder Teile der Seite neu zu rendern.  Der Datentransfer ist sehr gering – allerdings wird der Lebenszyklus der Seite trotzdem durchlaufen. Der Einbau ist durch die Implementierung zweier Interfaces relativ einfach und sauber.

Einfach
Elegant
Performant

Beispiel:

Damit das Callback funktioniert müssen folgende Interfaces implementiert werden:
  • ICallback
  • ICallbackEventHandler
Diese können sowohl in ein Control, als auch in eine normale Seite implementiert werden.
Das Interface hat zwei Methoden:

RaiseCallbackEvent wird für den clientseitigen Aufruf über eine Javascript Funktion benötigt

public void RaiseCallbackEvent(string eventArgument)
{
  //do something
}


GetCallbackResult wird aufgerufen, wenn RaiseCallbackEvent durch ist. Die Rückgabe würd asynchrony an die Javascript Funktion zurück gegeben.

public string GetCallbackResult()
{
  return "something";
}


Im Load oder Init Event werden folgende clientseitige Methoden registriert:

  • CallServer(arg, context) – ruft die serverseitige Methode auf
  • ReceiveServerData(arg, context) – bekommt das Ergebnis durch den „arg“ Parameter von GetCallbackResult()
protected void Page_Load(object sender, EventArgs e)
{
    ClientScriptManager scriptManager = Page.ClientScript;
    String callbackReference = scriptManager.GetCallbackEventReference(this, "arg",
    "ReceiveServerData", "");
    String callbackScript = "function CallServer(arg, context) {" + callbackReference + "; }";       
    scriptManager.RegisterClientScriptBlock(this.GetType(),"CallServer", callbackScript, true);
}


Die 2 Javascript Funktionen sehen wie folgt aus

function ReceiveServerData(arg, context)
{
  alert(arg);
}
function CallSrv()
{
  CallServer('get something', '');
}


Scriptservice – jQuery sei Dank!

Durch jQuery wurde es relativ einfach einen Webservice über Javascript aufzurufen. Wie bereits in einem letzten Eintrag beschrieben, werden über einen minimalen HTTP Post Request an den Server die benötigten Daten zurückgesendet. Diese sind in der Regel um einiges geringer als der komplette HTML Code dazu. Diese „reine Ajax Variante“ bringt das Problem mit sich, dass das Rendering auf dem Client stattfindet und dafür gibt es nur zwei simple Funktionen:
  • innerHTML, das den kompletten Inhalt eines Elements austauscht
  • DOM APIs, die mit Tags und Attributen arbeiten

Webservice

Fazit:

In der Praxis ist eine reine Ajax Vorgehensweise meist besser als das UpdatePanel Prinzip. Das Rendering findet auf dem Client statt und der Server schickt nur die benötigten Daten zurück. Dies ist zwar performant, dafür aber aufwendiger zu integrieren. Wer mit jQuery arbeitet, sollte sich auf jeden Fall über diese Möglichkeit Gedanken machen.

Einfach
Elegant
Performant

Beispiel:

Ein kurzer Auszug aus einem Beispiel. (In voller Länge)

Die Webservice methode

[WebMethod]
public string GetTestValue()
{
    return "Test value";
}


Der Javascript Aufruf

$.ajax({
    type        : "POST",
    url         : "Webservices.asmx/GetTestValue",
    data        : "",
    contentType : "application/json; charset=utf-8",
    dataType    : "json",
    success     : function( Result ) {
        // Result.d enthält die Rückgabe
        $("#MyContainer").html(Result.d);
    }
}


Welche Technik nun die passende ist, hängt immer stark vom Anwendungsfall ab - jede Technik hat ihre Stärken und Schwächen.
Grundsätzlich gilt - wenn Post Daten, Control States o.Ä. benötigt werden (bspw. bei einem größeren Eingabe-Formular), kann das UpdatePanel verwenden werden.
Wird darauf verzichtet, sollte das Callback bzw. der Webservice Aufruf in Betracht gezogen werden!

Update:
Einen Vergleich zu Ajax.Pro von René Drescher-Hackel findet sich hier!
Veröffentlicht Montag, 2. November 2009 22:05 von Roberto

Kommentare

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Danke für den Artikel Roberto, endlich mal auf Deutsch gut verglichen und beschrieben.

Dienstag, 3. November 2009 11:25 by Peter Bucher

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Hi Roberto,

ICallbackEventHandler? Ich bin seit Tagen dran agentarius.net davon zu befreien, denn was am Anfang so schick aussah, ist schlicht eine ungeheure Spass-Bremse.

Das liegt in meinem Fall sicherlich auch daran, dass das Load-Event in den meisten Fällen viel zu tun hat und der komplette Zyklus bei JEDEM Callback erneut durchlaufen wird.

Ich sag nur ascxLoader ... Zeitgewinn von ca. 300%!

Mittwoch, 4. November 2009 09:52 by kristof

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Hi Kristof,

da hast du Recht, ein großer Nachteil bei Callback ist, dass der Lebenszyklus komplett durchlaufen wird.

jQuery und Webservice - ich verwende das auch so oft es möglich ist :)

Mittwoch, 4. November 2009 14:20 by Roberto

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Hallo Roberto,

eine sehr gelungene Übersicht. Ich habe das ganze mal aus der Sicht mit Ajax.Pro betrachtet.

http://weblog.drescher-hackel.de/38D42556-AFF4-482B-AF53-8F6CD2D47ABE/Update+ohne+Panel+mit+AJAX.PRO.content.aspx

Im Ergebnis kann man aber sagen, man kommt auch gut ohne Updatepanel aus.

Sonntag, 22. November 2009 18:26 by Rene Drescher-Hackel

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Hallo Rene,

Sieht gut aus! Vielen Dank für dein Kommentar.

Habe es als Update im Eintrag markiert.

Roberto

Dienstag, 24. November 2009 09:36 by Roberto

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Hallo,

ich habe mal eine kurze Frage zum Verständnis der jQuery AJAX Implementation:

Bisher basiert meine Webanwendung, bei welcher mehrere UserControls auf einer Seite eingebunden sind, auf dem traditionellem Postback-Szenario. Nun würde ich gerne in meiner Anwendung die jQuery AJAX Variante, die hier als dritte und letzte Variante vorgestellt wurde, implementieren. Nun zu meiner Frage, müsste ich da alle bisherigen Klick-Events bzw. Requests durch einen jQuery AJAX Aufruf ersetzen und kann dann anschließend meine serverseitige Verarbeitung in den Webservice schreiben? oder ist dies zu einfach gedacht? Wie funktioniert das dann mit dem Rendering der Seite?

Montag, 13. September 2010 15:10 by NoGoQuest

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Hi,

grundsätzlich ist solch eine Umstellung sehr schwierig bzw. steht in keinem Verhältnis zum Aufwand. Die gesamten Formulardaten müssten bei dieser Variante per Javascript gesammelt und dem Webservice gesendet werden. Klick events gibts dann keine mehr.

An der Stelle würde ich eher ein normales Update Panel empfehlen, da Du bei diesem die Server Logik behalten kannst, sprich die Klick Events können bleiben.

Viel mehr würde die jQuery Variante Sinn machen, wenn Du bspw. on-the-fly überprüfen willst ob ein User bereits in der Datenbank vorhanden ist. So ein Request würde mit Postbacks viel zu lange dauern.

Viele Grüße,

Roberto

Mittwoch, 15. September 2010 17:37 by Roberto

# re: ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick

Hi Roberto,

wie sich kürzlich zeigte, ist jquery leider nicht zuverlässig beim IE 6/7 im Ajax-Request. Das Problem ließ sich dabei jederzeit reproduzieren. Ich denke, dass ich die Tage mehr und ausführlicher dazu schreiben kann.

Updatepanel bleibt aber dennoch keine optimale Lösung: man sollte den Weg gehen und dann lieber etwas Aufwand investieren und dann eine ordentliche AJAX-Anwendung bauen - mit allen dann erforderlichen Änderungen.

Gruß

Rene

Montag, 20. September 2010 00:03 by Rene Drescher-Hackel
Anonyme Kommentare sind nicht zugelassen