<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.aspnetzone.de/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Roberto's Blog : Callback, Javascript</title><link>http://www.aspnetzone.de/blogs/robertobez/archive/tags/Callback/Javascript/default.aspx</link><description>Ordnungsbegriffe: Callback, Javascript</description><dc:language /><generator>CommunityServer 2.1 SP2 (Build: 61120.2)</generator><item><title>ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick</title><link>http://www.aspnetzone.de/blogs/robertobez/archive/2009/11/02/asp-net-Ajax-UpdatePanel-Callback-jQuery-Webservice.aspx</link><pubDate>Mon, 02 Nov 2009 21:05:00 GMT</pubDate><guid isPermaLink="false">ce930855-ae9b-4fa4-8077-06a76071cc6a:214333</guid><dc:creator>Roberto</dc:creator><slash:comments>8</slash:comments><comments>http://www.aspnetzone.de/blogs/robertobez/comments/214333.aspx</comments><wfw:commentRss>http://www.aspnetzone.de/blogs/robertobez/commentrss.aspx?PostID=214333</wfw:commentRss><description>Dass mit diversen Techniken clientseitig über Javascript serverseitige Funktionen aufgerufen werden können ist nichts Neues.&lt;br&gt;Doch welche Technik überzeugt und welche passt am besten? In diesem Artikel werden drei grundlegende Vorgehensweisen erläutert und miteinander verglichen: &lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2009/11/02/asp-net-Ajax-UpdatePanel-Callback-jQuery-Webservice.aspx#UpdatePanel"&gt;Das Updatepanel&lt;/a&gt;, &lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2009/11/02/asp-net-Ajax-UpdatePanel-Callback-jQuery-Webservice.aspx#Callback"&gt;das Callback&lt;/a&gt; und der &lt;a href="http://www.aspnetzone.de/blogs/robertobez/archive/2009/11/02/asp-net-Ajax-UpdatePanel-Callback-jQuery-Webservice.aspx#Webservice"&gt;clientseitige Webservice Aufruf&lt;/a&gt;. Dazu gibt es jeweils ein kurzes Beispiel. &lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;a name="UpdatePanel"&gt;Das Updatepanel&lt;/a&gt; – Segen oder Fluch?&lt;/b&gt;&lt;br&gt;&lt;br&gt;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?&lt;br&gt;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. &lt;br&gt;&lt;br&gt;&lt;i&gt;„Es ist aber immer noch schneller als ein komplettes Postback!“&lt;/i&gt;&lt;br&gt;&lt;br&gt;Das stimmt tatsächlich - der Unterschied und Vorteil liegt also nicht in der Anforderung, sondern in der Antwort des Servers.&lt;br&gt;Nur bestimmte Teile der Seite bzw. des &lt;a target="_blank" href="http://msdn.microsoft.com/de-de/library/ms972427.aspx"&gt;Viewstates&lt;/a&gt; werden zurückgegeben und ausgetauscht (Partielles Rendering).&lt;br&gt;&lt;br&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/UpdatePanel.jpg" alt="Update Panel"&gt;&lt;br&gt;&lt;b&gt;Fazit:&lt;/b&gt;&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;&lt;table style="width:200px;" align="" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Einfach &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Elegant &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Performant &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;
&lt;br&gt;&lt;b&gt;Beispiel:&lt;/b&gt;&lt;br&gt;&lt;br&gt;Um die partiellen UpdatePanel Aktualisierungen nutzen zu können muss der Seite ein ScriptManager hinzugefügt werden&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;asp:ScriptManager&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ID&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="ScriptManager1"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;runat&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="server"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Die Deklaration des UpdatePanels siehst dann wie folgt aus (mehr Infos gibt es &lt;a target="_blank" title="ASP.NET Update Panel" href="http://www.asp.net/Ajax/Documentation/Live/overview/UpdatePanelOverview.aspx"&gt;hier&lt;/a&gt;)&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;asp:UpdatePanel&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ID&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="UpdatePanel1"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;runat&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="server"&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;asp:Label&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ID&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Message"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Text&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="This is a update panel…"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;runat&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="server"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;asp:Button&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ID&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Save"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;Text&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="Save"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;runat&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;="server"&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: Maroon;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;asp:UpdatePanel&lt;/span&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;a name="Callback"&gt;Das Callback&lt;/a&gt; – Keine Angst, es beißt nicht!&lt;/b&gt;&lt;br&gt;&lt;br&gt;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. &lt;br&gt;Wie das Updatepanel nützt auch das Callback das &lt;a title="XmlHttpRequest Objekt" target="_blank" href="http://de.wikipedia.org/wiki/XMLHttpRequest"&gt;XmlHttp Objekt&lt;/a&gt; intern zum Aufruf der Serverseitigen Methoden. &lt;br&gt;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.&lt;br&gt;Rückgabe des Callbacks können per json Serialisierte Daten oder auch normaler HTML Text sein.&lt;br&gt;&lt;br&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Callback.jpg" alt="Callback"&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Fazit:&lt;/b&gt;&lt;br&gt;&lt;br&gt;In bestimmten Fällen kann es durchaus Sinn machen, Servercode aufzurufen ohne dadurch ein Postback zu verursachen oder Teile der Seite neu zu rendern.&amp;nbsp; 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.&lt;br&gt;&lt;br&gt;&lt;table style="width:200px;" align="" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Einfach &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Elegant &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Performant &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;b&gt;Beispiel:&lt;/b&gt;&lt;br&gt;&lt;br&gt;Damit das Callback funktioniert müssen folgende &lt;a title="Interfaces" target="_blank" href="http://msdn.microsoft.com/de-de/library/87d83y5b%28VS.80%29.aspx"&gt;Interfaces &lt;/a&gt;implementiert werden:&lt;br&gt;&lt;ul&gt;&lt;li&gt;ICallback&lt;/li&gt;&lt;li&gt;ICallbackEventHandler&lt;/li&gt;&lt;/ul&gt;Diese können sowohl in ein Control, als auch in eine normale Seite implementiert werden.&lt;br&gt;Das Interface hat zwei Methoden: &lt;br&gt;&lt;br&gt;RaiseCallbackEvent wird für den clientseitigen Aufruf über eine Javascript Funktion benötigt&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; RaiseCallbackEvent(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; eventArgument)&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;//do something&lt;/span&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;GetCallbackResult wird aufgerufen, wenn RaiseCallbackEvent durch ist. Die Rückgabe würd asynchrony an die Javascript Funktion zurück gegeben.&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; GetCallbackResult() &lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"something"&lt;/span&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Im Load oder Init Event werden folgende clientseitige Methoden registriert:&lt;br&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;CallServer(arg, context) – ruft die serverseitige Methode auf&lt;/li&gt;&lt;li&gt;ReceiveServerData(arg, context) – bekommt das Ergebnis durch den „arg“ Parameter von GetCallbackResult()&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;protected&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    ClientScriptManager scriptManager &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; Page.ClientScript;&lt;br /&gt;    String callbackReference &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; scriptManager.GetCallbackEventReference(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"arg"&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"ReceiveServerData"&lt;/span&gt;, &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;""&lt;/span&gt;);&lt;br /&gt;    String callbackScript &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"function CallServer(arg, context) {"&lt;/span&gt; &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;+&lt;/span&gt; callbackReference &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;+&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"; }"&lt;/span&gt;;        &lt;br /&gt;    scriptManager.RegisterClientScriptBlock(&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;this&lt;/span&gt;.GetType(),&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"CallServer"&lt;/span&gt;, callbackScript, &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;true&lt;/span&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Die 2 Javascript Funktionen sehen wie folgt aus&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;function&lt;/span&gt; ReceiveServerData(arg, context)&lt;br /&gt;{&lt;br /&gt;  alert(arg);&lt;br /&gt;} &lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;function&lt;/span&gt; CallSrv()&lt;br /&gt;{&lt;br /&gt;  CallServer('get something', '');&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;a name="Webservice"&gt;Scriptservice&lt;/a&gt; – jQuery sei Dank!&lt;/b&gt;&lt;br&gt;&lt;br&gt;Durch &lt;a title="jQuery" target="_blank" href="http://jquery.com/"&gt;jQuery&lt;/a&gt; wurde es relativ einfach einen Webservice über Javascript aufzurufen. Wie bereits in einem &lt;a title="Übergabe komplexer Objekte per Json Serialisierung von jQuery zu ASP.NET Webservice" target="_blank" href="http://aspnetzone.de/blogs/robertobez/archive/2009/08/31/komplexe-objekte-per-json-serialisierung-von-jquery-zu-aspnet-webservice.aspx"&gt;letzten Eintrag beschrieben&lt;/a&gt;, 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:&lt;br&gt;&lt;ul&gt;&lt;li&gt;innerHTML, das den kompletten Inhalt eines Elements austauscht&lt;/li&gt;&lt;li&gt;DOM APIs, die mit Tags und Attributen arbeiten&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Webservice.jpg" alt="Webservice"&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Fazit:&lt;/b&gt;&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;&lt;table style="width:200px;" align="" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;Einfach &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Elegant &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Performant &lt;/td&gt;&lt;td&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;img src="http://11249.2.sihosting.net/Blog/Images/Star.gif"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;b&gt;Beispiel&lt;/b&gt;:&lt;br&gt;&lt;br&gt;Ein kurzer Auszug aus einem Beispiel. &lt;a title="Übergabe komplexer Objekte per Json Serialisierung von jQuery zu ASP.NET Webservice" target="_blank" href="http://aspnetzone.de/blogs/robertobez/archive/2009/08/31/komplexe-objekte-per-json-serialisierung-von-jquery-zu-aspnet-webservice.aspx"&gt;(In voller Länge)&lt;/a&gt;&lt;br&gt;&lt;br&gt;Die Webservice methode&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;[WebMethod]&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;string&lt;/span&gt; GetTestValue()&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;return&lt;/span&gt; &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Test value"&lt;/span&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Der Javascript Aufruf&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;$.ajax({&lt;br /&gt;    type        : &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"POST"&lt;/span&gt;,&lt;br /&gt;    url         : &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"Webservices.asmx/GetTestValue"&lt;/span&gt;,&lt;br /&gt;    data        : &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;""&lt;/span&gt;,&lt;br /&gt;    contentType : &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"application/json; charset=utf-8"&lt;/span&gt;,&lt;br /&gt;    dataType    : &lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"json"&lt;/span&gt;,&lt;br /&gt;    success     : &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;function&lt;/span&gt;( Result ) {&lt;br /&gt;        &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;// Result.d enthält die Rückgabe&lt;/span&gt;&lt;br /&gt;        $(&lt;span style="color: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 14px;font-weight: normal;"&gt;"#MyContainer"&lt;/span&gt;).html(Result.d);&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Welche Technik nun die passende ist, hängt immer stark vom Anwendungsfall ab - jede Technik hat ihre Stärken und Schwächen.&lt;br&gt;Grundsätzlich gilt - wenn Post Daten, Control States o.Ä. benötigt werden (bspw. bei einem größeren Eingabe-Formular), kann das UpdatePanel verwenden werden.&lt;br&gt;Wird darauf verzichtet, sollte das Callback bzw. der Webservice Aufruf in Betracht gezogen werden!&lt;br&gt;&lt;br&gt;
&lt;div class="HinweisBox"&gt;
&lt;b&gt;Update:&lt;/b&gt;&lt;br&gt;Einen Vergleich zu Ajax.Pro von &lt;a target="_blank" href="http://weblog.drescher-hackel.de"&gt;René Drescher-Hackel&lt;/a&gt; findet sich &lt;a target="_blank" href="http://weblog.drescher-hackel.de/38D42556-AFF4-482B-AF53-8F6CD2D47ABE/Update+ohne+Panel+mit+AJAX.PRO.content.aspx"&gt;hier&lt;/a&gt;!&lt;/div&gt;&lt;img src="http://www.aspnetzone.de/aggbug.aspx?PostID=214333" width="1" height="1"&gt;</description><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Webservice/default.aspx">Webservice</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Ajax/default.aspx">Ajax</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Callback/default.aspx">Callback</category><category domain="http://www.aspnetzone.de/blogs/robertobez/archive/tags/Update%20Panel/default.aspx">Update Panel</category></item></channel></rss>