<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Ajax</title>
        <link>http://blog.codemurai.de/category/Ajax.aspx</link>
        <description>Ajax</description>
        <language>de-DE</language>
        <copyright>André Krämer</copyright>
        <generator>Subtext Version 2.6.0.1</generator>
        <item>
            <title>ASP.NET Webforms Anwendungen und Ajax (Teil 7) - AjaxPro</title>
            <link>http://blog.codemurai.de/archive/2010/03/29/asp-net-webforms-anwendungen-und-ajax-teil-7-ajaxpro.aspx</link>
            <description>&lt;p&gt;In &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 5) Scriptservices, Page Methods und jQuery" href="http://blog.codemurai.de/2010/03/01/ASPNETWebformsAnwendungenUndAjaxTeil5ScriptservicesPageMethodsUndJQuery.aspx" target="_blank"&gt;Teil 5&lt;/a&gt; meiner ASP.NET Webforms und Ajax Serie wies &lt;a title="Weblog von René Drescher-Hackel" href="http://weblog.drescher-hackel.de/" target="_blank"&gt;René Drescher-Hackel&lt;/a&gt; mich darauf hin, dass ich einen Big Player vollkommen außer acht gelassen habe: &lt;a title="AjaxPro Homepage" href="http://ajaxpro.info/" target="_blank"&gt;AjaxPro&lt;/a&gt; von Michael &lt;a title="Blog von Michael Schwarz" href="http://weblogs.asp.net/mschwarz" target="_blank"&gt;Schwarz&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Das wollte ich natürlich nicht auf mir sitzen lassen. Daher befassen wir uns heute mit:&lt;/p&gt;  &lt;h2&gt;AjaxPro :-)&lt;/h2&gt;  &lt;p&gt;&lt;a title="AjaxPro Homepage" href="http://ajaxpro.info/" target="_blank"&gt;AjaxPro&lt;/a&gt; ist eine freie Library von Michael Schwarz, die Ajax unter ASP.NET ohne Postbacks ermöglicht. Vergleichbar ist AjaxPro somit am ehesten mit den in Teil 4 vorgestellten PageMethods. Ein großer Vorteil gegenüber diesen ist jedoch die Möglichkeit, AjaxPro auch unter ASP.NET 1.1 einsetzen zu können (ja - ich kenne wirklich noch aktive ASP.NET 1.1 Projekte ;-)). Angemerkt werden sollte noch, dass AjaxPro keiner Weiterentwicklung mehr unterliegt. Michael Schwarz schrieb in in seinem Blog, dass er die &lt;a title="Future of Ajax.NET Professional" href="http://weblogs.asp.net/mschwarz/archive/2008/01/04/future-of-ajax-net-professional.aspx" target="_blank"&gt;Arbeit an der Library einstellt&lt;/a&gt;. Als Alternative empfiehlt er den &lt;a title="How to... move from AjaxPro to ASP.NET AJAX PageMethods" href="http://weblogs.asp.net/mschwarz/archive/2008/01/08/how-to-move-from-ajaxpro-to-asp-net-ajax-pagemethods.aspx" target="_blank"&gt;Einsatz von PageMethods&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Lost gehts&lt;/h2&gt;  &lt;p&gt;AjaxPro ist relativ einfach eingebunden. Es genügt einen Verweis auf die Datei AjaxPro.2.dll hinzuzufügen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil7Aj_6DF2/01addreference.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="01addreference" src="/images/localhost/01addreference_thumb.png" width="244" height="185" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Weiter muss AjaxPro in der Datei web.config des Webprojekts bekannt gemacht werden. Dies geschieht über das Hinzufügen eines entsprechenden Http-Handlers:&lt;/p&gt;  &lt;pre class="brush: xml"&gt;&amp;lt;httpHandlers&amp;gt;
   ...
   &amp;lt;add verb="POST,GET" path="ajaxpro/*.ashx" type="AjaxPro.AjaxHandlerFactory, AjaxPro.2"/&amp;gt;
&amp;lt;/httpHandlers&amp;gt;&lt;/pre&gt;

&lt;p&gt;Anschließend müssen die Methoden einer Seite, die später via Ajax aufgerufen werden sollen, mit dem Attribut AjaxMethod annotiert werden. Dies funktioniert also ähnlich wie die bereits vorgestellten PageMethods. Der Quellcode dieses Beitrags basiert übrigens wieder auf dem Quellcode der vorherigen Teile dieser Serie.&lt;/p&gt;

&lt;pre class="brush: csharp" name="code"&gt;public partial class Teil7 : Page
{
    [AjaxPro.AjaxMethod]
    public string ReadStaticFile()
    {
        string fileContent;
        using (var reader = 
            new StreamReader(
                System.Web.HttpContext.Current.Server.MapPath("~/static.html")))
        {
            fileContent = reader.ReadToEnd();
        }
        return fileContent;
    }
}&lt;/pre&gt;

&lt;p&gt;Ein netter Nebeneffekt im Vergleich zu Pagemethods ist übrigens, dass die entsprechende Methode zwar statisch sein kann, dies aber nicht muss. Außerdem muss sich die Methode noch nicht einmal zwingend innerhalb einer Webseite (ASPX-Datei) befinden. Stattdessen kann Sie Mitglied einer beliebigen öffentlichen Klasse sein.&lt;/p&gt;

&lt;p&gt;Um diese Methode nun komfortabel per JavaScript aufrufen zu können, muss die zugehörige Klasse noch als AjaxTyp registriert werden. Dies geschieht in der Methode Page_Load der Klasse &lt;em&gt;Teil7&lt;/em&gt;.&lt;/p&gt;

&lt;pre class="brush: csharp"&gt;protected void Page_Load(object sender, System.EventArgs e)
{
    AjaxPro.Utility.RegisterTypeForAjax(typeof(Teil7));
}&lt;/pre&gt;

&lt;p&gt;Der Aufruf innerhalb der Seite kann nun wie folgt erfolgen:&lt;/p&gt;

&lt;pre class="brush: xml"&gt;&amp;lt;a href="#" id="StaticFileLink" onclick="Teil7.ReadStaticFile(ajaxdemo_callback)"&amp;gt;Hier klicken zum Request einer statischen Datei&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&lt;/pre&gt;

&lt;p&gt;Bei dem übergebenen Parametger ajaxdemo_callback handelt es sich um eine Callback Funktion, die die Antwort des Servers verarbeitet. In unserem Beispiel sieht sie wie folgt aus:&lt;/p&gt;

&lt;pre class="brush: js"&gt;&amp;lt;script type="text/javascript"&amp;gt;
    function ajaxdemo_callback(result) {
       var content = document.getElementById('content');
       content.innerHTML = result.value;
    }
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Die Seite ist nun funktionsfähig und kann gestartet werden. Ein Blick in die Firebug Ausgabe zeigt, dass neben der eigentlichen Seite automatisch noch 4 JavaScript Dateien geladen wurden. Diese sind für die Serverkommunikation zuständig und haben eine Gesamtgröße von &lt;strong&gt;nur 25 kb&lt;/strong&gt;! Im Vergleich zu den zuvor vorgestellten Lösungen ist dies das beste Ergebnis!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil7Aj_6DF2/02_initialesladen.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="02_initialesladen" src="/images/localhost/02_initialesladen_thumb.png" width="244" height="58" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Auch beim Aufruf der serverseitigen Methode schlägt sich AjaxPro gut. Hier gehen lediglich 111 Byte über die Leitung:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil7Aj_6DF2/03_ajaxcall.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="03_ajaxcall" src="/images/localhost/03_ajaxcall_thumb.png" width="244" height="167" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Der Aufruf selbst hat eine Datei mit der Endung *.ashx innerhalb des Pfads /ajaxpro zum Ziel. In meinem Beispiel lautet die URL: http://localhost:2800/AjaxDemo/ajaxpro/Teil7,App_Web_mke8f-yp.ashx. Er wird somit durch den zuvor in der web.config eingetragenen Http-Handler behandelt. Außerdem ist innerhalb der URL, wie man sehen kann, der Name der Klasse in der sich die entsprechende Methode befindet kodiert. Die Methode selbst wird im Header des Aufrufs als Attribut X-AjaxPro-Method übergeben. &lt;/p&gt;

&lt;h2&gt;Webservices&lt;/h2&gt;

&lt;p&gt;Nachdem sich PageMethods relativ einfach aufrufen ließen, stellt sich nun natürlich die Frage, wie die Methoden eines Webservices aufgerufen werden können.&lt;/p&gt;

&lt;p&gt;Eine Variante wäre es, die Methoden innerhalb des Webservices nicht nur mit dem Attribut [WebMethod] zu anotieren, sondern zusätzlich auch mit [AjaxPro.AjaxMethod] zu versehen. Diese Variante ist selbstverständlich nur für eigene und nicht für externe Webservices möglich.&lt;/p&gt;

&lt;p&gt;Ein allgemeingültiger Ansatz besteht darin, händisch Proxy-Methoden innerhalb der Seite für die gewünschten Webservice Methoden anzulegen.&lt;/p&gt;

&lt;pre class="brush: csharp" name="code"&gt;[AjaxPro.AjaxMethod]
public string CallHelloWorldService()
{
    return new AjaxDemoService().HelloWorld();
}

[AjaxPro.AjaxMethod]
public string CallEchoService(int value)
{

    return new AjaxDemoService().Echo(value);
}&lt;/pre&gt;

&lt;p&gt;Auf dem Client birgt der zusätzliche Code keine Überraschungen. Der Aufruf der serverseitigen Methoden erfolgt analog des ersten Beispiels. Die einzige Besonderheit ist der Aufruf der Methode CallEchoService, da diese einen Parameter erwartet.&lt;/p&gt;

&lt;pre class="brush: js" name="code"&gt;&amp;lt;script type="text/javascript"&amp;gt;
    function callEchoService() {
        var echoTextBox = document.getElementById('EchoTextBox');
        var value = echoTextBox.value;
        Teil7.CallEchoService(value, ajaxdemo_callback);
    }

    function ajaxdemo_callback(result) {
        var content = document.getElementById('content');
        content.innerHTML = result.value;
    }
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Wie der Beispielcode zeigt, wird der erwartete Parameter einfach vor die Angabe der JavaScript Callback Funktion gepackt.&lt;/p&gt;

&lt;h2&gt;Fazit&lt;/h2&gt;

&lt;p&gt;AjaxPro ist eine kleine und leichtgewichtige Ajax Library, die ohne unnötigen Ballast daher kommt. Durch die Ähnlichkeit zu Pagemethods und Scriptservices fiel mir die Einarbeitung ziemlich leicht und nahm kaum mehr als eine halbe Stunde in Anspruch.&lt;/p&gt;

&lt;p&gt;Trotz dieser Vorteile kann ich mir nicht vorstellen, AjaxPro als Standardwerkzeug in aktuellen Projekten zu nutzen. Stattdessen werde ich wohl weiterhin auf jQuery setzen. Der Grund für diese Entscheidung liegt ganz einfach darin, dass ich jQuery zu UI Manipulationszwecken meist sowieso schon auf meinen Seiten referenziert habe. Daher ist es naheliegend für AjaxRequests auch zu jQuery zu greifen.&lt;/p&gt;

&lt;p&gt;Sehr gut vorstellen könnte ich mir jedoch, AjaxPro in ASP.NET 1.1 Projekten zu nutzen, die sich noch in Pflege befinden. In diesen fehlt die Möglichkeit, PageMethods und Scriptservices einzusetzen, so das AjaxPro dort das perfekte Werkzeug wäre.&lt;/p&gt;

&lt;p&gt;An dieser Stelle auch noch einmal vielen Dank an &lt;a title="Weblog von René Drescher-Hackel" href="http://weblog.drescher-hackel.de/" target="_blank"&gt;René&lt;/a&gt; für den hilfreichen Tipp.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:60ae97fb-545f-4509-b3c8-42a47c35fe5b" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://blog.codemurai.de/tags/.NET/default.aspx" rel="tag"&gt;.NET&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/ASP.NET/default.aspx" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/Ajax/default.aspx" rel="tag"&gt;Ajax&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/AjaxPro/default.aspx" rel="tag"&gt;AjaxPro&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blog.codemurai.de/aggbug/135.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>André Krämer</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/03/29/asp-net-webforms-anwendungen-und-ajax-teil-7-ajaxpro.aspx</guid>
            <pubDate>Mon, 29 Mar 2010 23:12:04 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/03/29/asp-net-webforms-anwendungen-und-ajax-teil-7-ajaxpro.aspx#feedback</comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/135.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Microsoft, Ajax und JQuery</title>
            <link>http://blog.codemurai.de/archive/2010/03/17/microsoft-ajax-und-jquery.aspx</link>
            <description>&lt;p&gt;Wie &lt;a title="Stephen Walters Blog" href="http://stephenwalther.com/" target="_blank"&gt;Stephen Walter&lt;/a&gt; in seinem Blog angekündigt hat, stoppt Microsoft die Entwicklung des eigenen &lt;a href="http://ajax.codeplex.com" target="_blank"&gt;clientseitigen ASP.NET Ajax Libra&lt;/a&gt;ry und steuert stattdessen &lt;a href="http://blog.jquery.com/2010/03/16/microsoft-to-expand-its-collaboration-with-the-jquery-community/" target="_blank"&gt;Code zu jQuery&lt;/a&gt; bei. Bedeutet Microsoft hat jQuery nicht "übernommen", sondern steuert wie jeder andere einfach nur Quellcode bei bzw. schlägt Features vor, die anschließend durch das jQuery Team geprüft werden.&lt;/p&gt;  &lt;p&gt;Da die Beta der &lt;a href="http://ajax.codeplex.com" target="_blank"&gt;ASP.NET Ajax Library&lt;/a&gt; nun bereits seit November verfügbar war, überraschte mich diese Ankündigung ein wenig. Andererseits fragte ich mich, je tiefer ich mich mit der Library beschäftigte, sowieso weshalb man den clientseitigen Teil neben jQuery überhaupt brauchen würde.&lt;/p&gt;  &lt;p&gt;Jedem der sich nun genötigt fühlt, jQuery zu lernen, dem kann ich nur wärmstens &lt;a title="Blog von Dave Ward mit vielen Tipps und Tricks zu jQuery" href="http://encosia.com/" target="_blank"&gt;Dave Wards Blog&lt;/a&gt; empfehlen. Außerdem ist seine &lt;a href="http://tekpub.com/view/jquery/1" target="_blank"&gt;Tekpub jQuery Serie&lt;/a&gt; die er gemeinsam mit James Avery aufzeichnet natürlich auch Pflichtprogramm.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:807f195f-55ec-4cf0-b03d-a6f0dc4c9fe1" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://blog.codemurai.de/tags/ASP.NET/default.aspx" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/jQuery/default.aspx" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/Webentwicklung/default.aspx" rel="tag"&gt;Webentwicklung&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blog.codemurai.de/aggbug/139.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>André Krämer</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/03/17/microsoft-ajax-und-jquery.aspx</guid>
            <pubDate>Wed, 17 Mar 2010 11:41:29 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/03/17/microsoft-ajax-und-jquery.aspx#feedback</comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/139.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET Webforms Anwendungen und Ajax (Teil 6) kleine Tipps die das Leben leichter machen.</title>
            <link>http://blog.codemurai.de/archive/2010/03/11/asp-net-webforms-anwendungen-und-ajax-teil-6-kleine-tipps.aspx</link>
            <description>&lt;p&gt;In den letzten 5 Einträgen meines Blogs habe ich über verschiedene Möglichkeiten geschrieben Ajax in einer ASP.NET Webforms zu implementieren.&lt;/p&gt;  &lt;p&gt;Angefangen mit dem manuellen Weg über das &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 1)" href="http://blog.codemurai.de/2010/01/28/ASPNETWebformsAnwendungenUndAjaxTeil1.aspx" target="_blank"&gt;XmlHttpRequest Objekt&lt;/a&gt; ging es weiter zu &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 2) Client Callbacks" href="http://blog.codemurai.de/2010/02/05/ASPNETWebformsAnwendungenUndAjaxTeil2ClientCallbacks.aspx" target="_blank"&gt;Client Callbacks&lt;/a&gt;, dem &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 3) Das Updatepanel" href="http://blog.codemurai.de/2010/02/11/ASPNETWebformsAnwendungenUndAjaxTeil3DasUpdatepanel.aspx" target="_blank"&gt;Updatepanel&lt;/a&gt;, dem &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 4) Scriptservices, Page Methods und das ASP.NET AJAX Framework" href="http://blog.codemurai.de/2010/02/18/ASPNETWebformsAnwendungenUndAjaxTeil4ScriptservicesPageMethodsUndDasASPNETAJAXFramework.aspx" target="_blank"&gt;ASP.NET Ajax Framework&lt;/a&gt; sowie &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 5) Scriptservices, Page Methods und jQuery" href="http://blog.codemurai.de/2010/03/01/ASPNETWebformsAnwendungenUndAjaxTeil5ScriptservicesPageMethodsUndJQuery.aspx" target="_blank"&gt;jQuery&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Der Fokus meiner Beiträge lag darauf nicht nur einfach zu zeigen welche Möglichkeiten es gibt, sondern zusätzlich auch zu zeigen, welche Datenmengen über die Leitung gehen und ob bzw. welche Teile des ASP.NET Page Life Cycles durchlaufen werden.&lt;/p&gt;  &lt;p&gt;Ich hoffe dass ich bei dem ein oder anderen Leser für manchen Aha Effekt sorgen konnte. Zumindest ging es mir persönlich bei der ersten detaillierten Auseinandersetzung mit dem Thema so. Schließlich ist man als ASP.NET Webforms Entwickler traditionell doch eher auf dem Server zu Hause und realisiert vorerst garnicht welchen Overhead Client Callbacks oder das Updatepanel mit sich bringen.&lt;/p&gt;  &lt;p&gt;Mein persönliches Fazit ist, dass Updatepanel und Client Callbacks korrekt eingesetzt in einigen Fällen vielleicht berechtigte Alternativen sind, in den meisten Fällen jedoch zum Ajax Framework oder jQuery gegriffen werden sollte.&lt;/p&gt;  &lt;p&gt;Meine zurzeit favorisierte Lösung ist - ähnlich wie bei vielen anderen sicherlich auch - der Einsatz von jQuery.&lt;/p&gt;  &lt;p&gt;Da mein letztes Beispiel noch ein wenig aufgebläht war, möchte ich an dieser Stelle zwei kurze Tipps geben, die die Arbeit mit jQuery und Ajax ein wenig erleichtern.&lt;/p&gt;  &lt;p&gt;Der erste Punkt beschäftigt sich mit der großen Redundanz zwischen den verschiedenen Ajax Aufrufen:&lt;/p&gt;  &lt;pre class="brush: js" name="code"&gt;$("#StaticFileLink").click(function(e) {
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "Teil5.aspx/ReadStaticFile",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            $("#content").html(msg.d);
        }
    });
});

$("#HelloWorldLink").click(function(e) {
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "AjaxDemoService.asmx/HelloWorld",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            $("#content").html(msg.d);
        }
    });
});

$("#EchoLink").click(function(e) {
    e.preventDefault();
    var number = $("#EchoTextBox").val();
    var jsonData = "{ 'number' : '" + number + "'}";
    $.ajax({
        type: "POST",
        url: "AjaxDemoService.asmx/Echo",
        data: jsonData,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            $("#content").html(msg.d);
        }
    });
});&lt;/pre&gt;

&lt;p&gt;Bereits beim ersten Blick auf den Quellcode fällt auf, dass die Werte einiger Parameter statisch zu sein scheinen. So haben folgende Parameter stets einen fixen Wert:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;type &lt;/li&gt;

  &lt;li&gt;contentType &lt;/li&gt;

  &lt;li&gt;dataType &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Außerdem ist zumindest in den ersten beiden Aufrufen auch der Eintrag für data gleich.&lt;/p&gt;

&lt;p&gt;Ein Weg um diese Redundanz herum zu kommen wäre eine eigene Funktion, die nur die Variablen Parameter entgegen nimmt.&lt;/p&gt;

&lt;h2&gt;Standardwerte setzen&lt;/h2&gt;

&lt;p&gt;Eine andere Alternative besteht darin, Standardwerte für jQuery Ajax Aufrufe zu setzen. Dies sähe dann so aus:&lt;/p&gt;

&lt;pre class="brush: js"&gt;&amp;lt;script type="text/javascript"&amp;gt;
    $(document).ready(function() {
        $.ajaxSetup({
            type: "POST",
            data: "{}",
            contentType: "application/json; charset=utf-8",
            dataType: "json"
        });
        $("#StaticFileLink").click(function(e) {
            e.preventDefault();
            $.ajax({
                url: "Teil6.aspx/ReadStaticFile",
                success: function(msg) {
                    $("#content").html(msg.d);
                }
            });
        });

        $("#HelloWorldLink").click(function(e) {
            e.preventDefault();
            $.ajax({
                url: "AjaxDemoService.asmx/HelloWorld",
                success: function(msg) {
                    $("#content").html(msg.d);
                }
            });
        });

        $("#EchoLink").click(function(e) {
            e.preventDefault();
            var number = $("#EchoTextBox").val();
            var jsonData = "{ 'number' : '" + number + "'}";
            $.ajax({
                url: "AjaxDemoService.asmx/Echo",
                data: jsonData,
                success: function(msg) {
                    $("#content").html(msg.d);
                }
            });
        });
    });
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Neu hinzugekommen sind die Zeilen 2 - 8. Diese setzen Standardwerte für alle folgenden Ajax Aufrufe. Diese Variante kann einiges an Code sparen, ist allerdings mit Vorsicht zu genießen. Sollte nämlich zum Beispiel ein jQuery Plug-In auf der Seite genutzt werden, dass auch die $.ajax Funktion nutzt, könnte es zu Seiteneffekten kommen. Konkret wäre dies der Fall, wenn einer der per .ajaxSetup gesetzten Parameter nicht überschrieben, aber mit einem anderen Wert erwartet wäre. Typischerweise würde dies für den contentType oder oder dataType geschehen.&lt;/p&gt;

&lt;h2&gt;Serialisieren - einfach gemacht&lt;/h2&gt;

&lt;p&gt;Eine weitere Unschönheit des gezeigten Quellcodes besteht darin, dass die String Variante des in JSON notierten Objekts data von Hand zusammen gebaut wurde. Dies ist natürlich nicht sonderlich schick. Abhilfe schafft die Funktion stringify des Objekts JSON. Einige Browser wie &lt;a title="JSON in Firefox 3.5" href="https://developer.mozilla.org/en/JSON#JSON.c2.a0in_Firefox_3.5" target="_blank"&gt;Firefox ab Version 3.5&lt;/a&gt; oder &lt;a title="Native JSON in IE8" href="http://blogs.msdn.com/ie/archive/2008/09/10/native-json-in-ie8.aspx" target="_blank"&gt;IE ab der Version 8&lt;/a&gt; haben bereits ein eingebautes Objekt JSON. Für alle anderen gibt es unter &lt;a title="http://www.json.org/js.html" href="http://www.json.org/js.html"&gt;http://www.json.org/js.html&lt;/a&gt; eine JavaScript Library zum Download, die entsprechenden Support nachrüstet, falls noch nicht vorhanden.&lt;/p&gt;

&lt;p&gt;Konkret sähe dies dann wie folgt aus:&lt;/p&gt;

&lt;pre class="brush: js"&gt;&amp;lt;script src="scripts/json2.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;

[ ... ]


$("#EchoLink").click(function(e) {
    e.preventDefault();
    var number = $("#EchoTextBox").val();
    var jsonData = { 'number': number };
    var jsonString = JSON.stringify(jsonData);
    $.ajax({
        url: "AjaxDemoService.asmx/Echo",
        data: jsonString,
        success: function(msg) {
            $("#content").html(msg.d);
        }
    });&lt;/pre&gt;

&lt;p&gt;Wie man sieht, wird nun in Zeile 9 zuerst ein JavaScript Objekt jsonData in JSON Notation erzeugt. Dies wird anschließend über JSON.stringify in Zeile 10 in einen String konvertiert. Bei diesem konkreten Beispiel mag der Vorteil noch nicht auf der Hand liegen, spätestens bei komplexen Objekten lernt man die Funktion stringify jedoch schnell zu schätzen.&lt;/p&gt;

&lt;p&gt;Bei der Recherche zu den Beiträgen dieser Serie bin ich übrigens auf einen sehr gut geschriebenen Eintrag von &lt;a title="ASP.NET Update Panel, Callback und jQuery Webservice - Drei Ajax Techniken im Überblick" href="http://www.aspnetzone.de/blogs/robertobez/archive/2009/11/02/asp-net-Ajax-UpdatePanel-Callback-jQuery-Webservice.aspx" target="_blank"&gt;Roberto Bez&lt;/a&gt; gestolpert. Roberto stellt in seinem Blog Post die verschiedenen Varianten kompakt gegenüber. Die Lektüre des Artikels kann ich jedem Ajax interessierten Webforms Entwickler wärmstens empfehlen.&lt;/p&gt;

&lt;p&gt;Weiter hat &lt;a title="Blog von René Drescher-Hackel" href="http://weblog.drescher-hackel.de" target="_blank"&gt;René Drescher-Hackel&lt;/a&gt; in einem Kommentar zu meinem letzen Beitrag, dass mit &lt;a href="http://www.ajaxpro.info/" target="_blank"&gt;Ajax.NET Professional (AJAX.PRO)&lt;/a&gt; eine weitere effiziente Alternative zur Verfügung steht. Ich muss gestehen, dass mir die Existenz dieses Frameworks bis jetzt vollkommen entgangen ist. Gelobe allerdings Besserung und werde es mir gerne ansehen und mein Beispiel damit umsetzen.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:74d584c0-49dd-432f-8e03-4e990d5907ab" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://blog.codemurai.de/tags/ASP.NET/default.aspx" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/jQuery/default.aspx" rel="tag"&gt;jQuery&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/.NET/default.aspx" rel="tag"&gt;.NET&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/Webentwicklung/default.aspx" rel="tag"&gt;Webentwicklung&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blog.codemurai.de/aggbug/140.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>André Krämer</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/03/11/asp-net-webforms-anwendungen-und-ajax-teil-6-kleine-tipps.aspx</guid>
            <pubDate>Thu, 11 Mar 2010 22:44:25 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/03/11/asp-net-webforms-anwendungen-und-ajax-teil-6-kleine-tipps.aspx#feedback</comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/140.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET Webforms Anwendungen und Ajax (Teil 5) Scriptservices, Page Methods und jQuery</title>
            <link>http://blog.codemurai.de/archive/2010/03/02/asp-net-webforms-anwendungen-und-ajax-teil-5-scriptservices-page.aspx</link>
            <description>&lt;p&gt;Im &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 4) Scriptservices, Page Methods und das ASP.NET AJAX Framework" href="http://blog.codemurai.de/2010/02/18/ASPNETWebformsAnwendungenUndAjaxTeil4ScriptservicesPageMethodsUndDasASPNETAJAXFramework.aspx" target="_blank"&gt;vierten Teil dieser Serie&lt;/a&gt; habe ich gezeigt, wie Pagemethods und Scriptservices mit dem ASP.NET Ajax Framework angesprochen werden können. Im Vergleich zu den vorherigen Teilen, die auf &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 2) Client Callbacks" href="http://blog.codemurai.de/2010/02/05/ASPNETWebformsAnwendungenUndAjaxTeil2ClientCallbacks.aspx" target="_blank"&gt;Client Callbacks&lt;/a&gt; bzw. das &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 3) Das Updatepanel" href="http://blog.codemurai.de/2010/02/11/ASPNETWebformsAnwendungenUndAjaxTeil3DasUpdatepanel.aspx" target="_blank"&gt;Updatepanel&lt;/a&gt; setzen, konnte über diesen Weg die übertragene Datenmenge erheblich verkleinert werden, da unter anderem der Viewstate nicht mehr übertragen werden musste. Außerdem wurde serverseitig nicht mehr der komplette Page Life Cycle durchlaufen, was weitere Performanceverbesserungen mit sich brachte.&lt;/p&gt;  &lt;p&gt;Im Gegenzug zu diesen Verbesserungen mussten wir allerdings in Kauf nehmen, dass beim ersten Request drei zusätzliche JavaScript Dateien des Ajax Frameworks mit einer Gesamtgröße von 85 kb geladen wurden.&lt;/p&gt;  &lt;p&gt;Hält man im Hinterkopf, dass der Viewstate einer Seite schnell 50 kb und mehr beträgt und dieser bei jedem Ajax Request der vorherigen Methoden hin und her übertragen wurde, lassen sich diese 85 kb jedoch sicherlich leicht verschmerzen.&lt;/p&gt;  &lt;p&gt;Doch wie sieht es aus, wenn neben dem Ajax Framework auch jQuery in die Seite eingebunden wurde, um die Oberfläche zu tunen?&lt;/p&gt;  &lt;p&gt;In diesem Fall stellt sich die Situation anders dar, nun ist das ASP.NET Ajax Framework clientseitig nämlich reiner Ballast. Zumindest wenn es darum geht Pagemethods und Scriptservcies aufzurufen. Das kann jQuery nämlich auch.&lt;/p&gt;  &lt;h4&gt;Also weg damit!&lt;/h4&gt;  &lt;p&gt;Wie müssen wir aber vorgehen, um Pagemethods und Scriptservices aus jQuery rufen zu können?&lt;/p&gt;  &lt;p&gt;Zunächst kopieren wir den kompletten Code unseres letzten Beispiels. Wenn wir nun einen Blick auf den Code werfen sehen wir in der *.aspx Datei einen ScriptManager. &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:507f16c9-2bcd-4883-ba7f-59b558189ea4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True"&amp;gt;
  &amp;lt;Services&amp;gt;
    &amp;lt;asp:ServiceReference Path="~/AjaxDemoService.asmx" /&amp;gt;
  &amp;lt;/Services&amp;gt;
&amp;lt;/asp:ScriptManager&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dieser war notwendig, damit das ASP.NET Ajax Framework die JavaScript Proxies erstellte, die uns Aufrufe in der Form &lt;em&gt;PageMethods.Methodenname&lt;/em&gt; bzw. &lt;em&gt;WebServiceName.Methodenname&lt;/em&gt; erlaubten.&lt;/p&gt;

&lt;p&gt;Der ScriptManager ist allerdings überflüssig wenn man Pagemethods und Scriptservices via jQuery rufen möchte. &lt;strong&gt;Daher fliegt er raus&lt;/strong&gt;. Weiter entfernen wir den bestehenden inline JavaScript Code der Seite und räumen Sie noch ein wenig auf. Das Ergebnis sieht wie folgt aus:&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6e43b782-f30a-4500-8414-d1df043c09bb" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Teil5.aspx.cs" Inherits="Teil5" %&amp;gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;
&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&amp;gt;
    &amp;lt;head runat="server"&amp;gt;
        &amp;lt;title&amp;gt;ASP.NET Webforms Anwendungen und Ajax (Teil 5): Scriptservices mit jQuery&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;form id="form1" runat="server"&amp;gt;
            &amp;lt;h1&amp;gt;
                ASP.NET Webforms Anwendungen und Ajax (Teil 5): Scriptservices mit jQuery&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;
                &amp;lt;a href="#" id="StaticFileLink"&amp;gt;Hier klicken zum Request einer statischen Datei&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
                &amp;lt;a href="#" id="HelloWorldLink"&amp;gt;Hier für Hello World WebService klicken &amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;
                &amp;lt;a href="#" id="EchoLink"&amp;gt;Hier für Echo WebService klicken. Geben Sie bitte vorher eine
                    Zahl in nebenstehendem Feld ein: &amp;lt;/a&amp;gt;&amp;amp;nbsp;
                &amp;lt;input type="text" id="EchoTextBox" value="4711" /&amp;gt;
            &amp;lt;/p&amp;gt;
            &amp;lt;div id="content"&amp;gt;
                Bitte klicken Sie auf einen der Links, damit dieser Bereich gefüllt wird.
            &amp;lt;/div&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Der &lt;a href="http://blog.codemurai.de/2010/02/18/ASPNETWebformsAnwendungenUndAjaxTeil4ScriptservicesPageMethodsUndDasASPNETAJAXFramework.aspx" target="_blank"&gt;serverseitige Code&lt;/a&gt; des vorherigen Beispiels wurde übrigens nicht verändert.&lt;/p&gt;

&lt;p&gt;Unsere Seite umfasst nun schlanke 1,6 kb, wie die folgende Abbildung zeigt:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/5AS.NETWebformsAnwendungenundAjaxTeil4Sc_7BF4/01_Seite.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="105" alt="01_Seite" src="/images/localhost/01_Seite_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Allerdings kann sie auch noch nichts ;-) &lt;/p&gt;

&lt;p&gt;Darum werden wir uns aber in den nächsten Schritten kümmern.&lt;/p&gt;

&lt;h4&gt;jQuery let's go&lt;/h4&gt;

&lt;p&gt;Als erstes benötigen wir eine Referenz auf jQuery. Diese erhalten wir über folgenden Script Tag, den wir innerhalb des Head Bereichs der Seite einfügen:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:387edf3a-5ca5-4775-9e98-e3f1e0d9c5a7" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;script src="scripts/jquery-1.3.2.min.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt; &lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Als nächstes fügen wir den Code ein, um den Link zur Anzeige der statischen Datei zum fliegen zu bekommen. Dieser sieht wie folgt aus:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6ad27a95-ec14-4472-a147-62e75b649b81" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js"&gt;&amp;lt;script type ="text/javascript"&amp;gt;
    $(document).ready(function() {
        $("#StaticFileLink").click(function(e) {
            e.preventDefault();
            $.ajax({
                type: "POST",
                url: "Teil5.aspx/ReadStaticFile",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(result) {
                    $("#content").html(result.d);
                }
            });
        });
	 });
&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Relevant für uns sind die Zeilen 5 - 14. Da es jedoch vielleicht den ein oder anderen Leser gibt, der noch nie mit jQuery gearbeitet hat, möchte ich auch zu den anderen Zeilen ein paar Worte verlieren.&lt;/p&gt;

&lt;p&gt;Auffällig sind zunächst die vielen $-Zeichen innerhalb des Codes. Dabei handelt es sich um einen Alias für die Funktion &lt;em&gt;jQuery&lt;/em&gt;. &amp;#220;berall wo ein $ steht, könnte man sich also auch &lt;em&gt;jQuery&lt;/em&gt; denken.&lt;/p&gt;

&lt;p&gt;Die Funktion jQuery nimmt ein DOM Element bzw. einen CSS Selektor als Argument entgegen. In &lt;strong&gt;Zeile 2&lt;/strong&gt; wird das DOM Element &lt;em&gt;document&lt;/em&gt;, also eine Referenz auf unser eigentliches HTML Dokument übergeben. Anschließend wird an das Ereignis &lt;em&gt;ready&lt;/em&gt; eine anonyme Funktion gehangen. Das Ereignis &lt;em&gt;ready&lt;/em&gt; tritt übrigens auf, sobald das DOM vollständig initialisiert wurde, jedoch ehe weitere Inhalte wie Beispielsweise Bilder herunter geladen wurden. Somit hat man innerhalb des &lt;em&gt;ready&lt;/em&gt; Ereignisses zwar Zugriff auf das vollständig initialisierte DOM, muss aber nicht den kompletten Seitenaufbau abwarten.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Zeile 3&lt;/strong&gt; wird die &lt;em&gt;jQuery&lt;/em&gt; Funktion mit dem CSS Selektor &lt;em&gt;#StaticFileLink&lt;/em&gt; gefüllt, um das DOM Element mit der ID StaticFileLink, also unseren Link, zu selektieren. An das Ereignis &lt;em&gt;click&lt;/em&gt; des Links wird wieder eine anonyme Funktion gehangen.&lt;/p&gt;

&lt;p&gt;In Zeile 4 wird über &lt;em&gt;e.preventDefault();&lt;/em&gt; die Standardaktion des Links verhindert. In unserem Fall also, dass beim Klick auf dem Link dem Inhalt des &lt;em&gt;href&lt;/em&gt; Attributs gefolgt wird. Stattdessen wird ab der Zeile 5 definiert, dass ein &lt;a title="Dokumentation der jQuery Funktion ajax" href="http://api.jquery.com/jQuery.ajax/" target="_blank"&gt;ajax&lt;/a&gt; Aufruf gefeuert werden muss.&lt;/p&gt;

&lt;p&gt;Dabei werden folgende Werte an die verschiedenen Parameter der Funktion &lt;a title="Dokumentation der jQuery Funktion ajax" href="http://api.jquery.com/jQuery.ajax/" target="_blank"&gt;ajax&lt;/a&gt; übergeben:&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="2" width="100%" border="1"&gt;&lt;thead&gt;
    &lt;tr&gt;
      &lt;th valign="top" width="133"&gt;Parameter&lt;/th&gt;

      &lt;th valign="top" width="133"&gt;Wert&lt;/th&gt;

      &lt;th valign="top"&gt;Erklärung&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="133"&gt;type&lt;/td&gt;

      &lt;td valign="top" width="133"&gt;&lt;strong&gt;POST&lt;/strong&gt; (fix)&lt;/td&gt;

      &lt;td valign="top"&gt;Ajax Anfragen an Pagemethods oder Scriptsservices müssen aus Sicherheitsgründen immer vom Typ POST sein, um JSON hijacking Angriffe abzuwehren. Eine sehr gute Beschreibung hierzu gibt es &lt;a title="Beschreibung einer JSON Sicherheitslücke" href="http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx" target="_blank"&gt;im Blog von Phil Haack&lt;/a&gt;.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="133"&gt;url&lt;/td&gt;

      &lt;td valign="top" width="133"&gt;{Seitenname.aspx}/{Methodenname}&lt;/td&gt;

      &lt;td valign="top"&gt;Ziel des Ajax Aufrufs. Im Falle einer Page Method nach dem Schema &lt;em&gt;{Seitenname.&lt;strong&gt;aspx&lt;/strong&gt;}/{Methodenname}&lt;/em&gt;, im Fall von ScriptServices &lt;em&gt;{Servicename.&lt;strong&gt;asmx&lt;/strong&gt;}/{Methodenname}&lt;/em&gt;. Wichtig ist, dass die entsprechende Methode im Falle von Pagemethods statisch ist und mit dem Attribut &lt;em&gt;WebMethod&lt;/em&gt; dekoriert wurde. Im Falle eines ScriptServices ist auf die Dekorierung des Services mit dem Attribut &lt;em&gt;ScriptService&lt;/em&gt; zu achten.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="133"&gt;data&lt;/td&gt;

      &lt;td valign="top" width="133"&gt;JSON String&lt;/td&gt;

      &lt;td valign="top"&gt;Erwartet die Methode Parameter, sind diese hier als JSON String, und nicht als JSON Objekt zu übergeben! Falls die Methode keine Parameter erwartet, sollte stets ein leeres JSON Objekt übergeben werden (also &lt;em&gt;&amp;quot;{}&amp;quot;&lt;/em&gt;). Andernfalls übergibt jQuery als contentType statt &lt;em&gt;application/json&lt;/em&gt; automatisch &lt;em&gt;text/html&lt;/em&gt;.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="133"&gt;contentType&lt;/td&gt;

      &lt;td valign="top" width="133"&gt;application/json; charset=utf-8 (fix)&lt;/td&gt;

      &lt;td valign="top"&gt;Als Content Type ist stets &lt;em&gt;application/json; charset=utf-8&lt;/em&gt; zu übergeben. Dies ist das Zeichen für das ASP.NET Ajax Framework, serverseitig die Anfrage an den ScriptService Handler und nicht an den Soap Webservice Handler weiterzuleiten.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="133"&gt;dataType&lt;/td&gt;

      &lt;td valign="top" width="133"&gt;json (fix).&lt;/td&gt;

      &lt;td valign="top"&gt;Gibt den Datentyp der Antwort an. Gültige Antworten sind unter anderem json, script, xml oder text. Im Fall von Pagemethods und ScriptServices kommt immer JSON zurück.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="133"&gt;succes&lt;/td&gt;

      &lt;td valign="top" width="133"&gt;Anonyme Funktion bzw. Funktionsname&lt;/td&gt;

      &lt;td valign="top"&gt;Eine Anonyme Funktion bzw. der Name einer Funktion, die die Rückgabe der Methode verarbeitet.
        &lt;br /&gt;Im Falle von PageMethods und ScriptServices wird die Antwort aus Sicherheitsgründen übrigens immer in ein Objekt Namens &lt;em&gt;d &lt;/em&gt;verpackt (siehe auch Zeile 12 des Scripts). Die Ursache hierfür ist ähnlich wie beim Parameter type und wird auch näher in &lt;a title="JSON Hijacking erklärt" href="http://haacked.com/archive/2009/06/25/json-hijacking.aspx" target="_blank"&gt;Phil Haacks Blog Eintrag&lt;/a&gt; erklärt.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Der Aufruf des Services sollte somit ausreichend erklärt sein. Einzig Zeile 12 bedarf noch einer kleinen Erklärung:&lt;/p&gt;

&lt;p&gt;Via $(&amp;quot;#Content&amp;quot;) holt jQuery sich eine Referenz auf den Zielbereich in mithilfe der Funktion html die Antwort des Ajax Requests geschrieben wird.&lt;/p&gt;

&lt;p&gt;Der Code zum Aufruf der beiden Webservice Methoden sieht erwartungsgemäß ähnlich aus:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:df55179d-b395-4780-8763-c85b0906a6fa" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="js"&gt;            $("#HelloWorldLink").click(function(e) {
                e.preventDefault();
                $.ajax({
                    type: "POST",
                    url: "AjaxDemoService.asmx/HelloWorld",
                    data: "{}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(msg) {
                        $("#content").html(msg.d);
                    }
                });
            });

            $("#EchoLink").click(function(e) {
                e.preventDefault();
                var number = $("#EchoTextBox").val();
                var jsonData = "{ 'number' : '" + number + "'}";
                $.ajax({
                    type: "POST",
                    url: "AjaxDemoService.asmx/Echo",
                    data: jsonData,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function(msg) {
                        $("#content").html(msg.d);
                    }
                });
            });&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Erklärenswert ist einzig Zeile 18. Hier wird ein Json String zusammen gesetzt, der später an die entsprechende Methode des Webservices übergeben wird. Dies geht im Falle eines Arguments noch ganz gut, wird aber spätestens bei zwei oder mehr Argumenten sehr lästig. Abhilfe schafft hier die Methode &lt;em&gt;stringify&lt;/em&gt; des Objekts &lt;em&gt;JSON&lt;/em&gt;. Die Methode überführt ein Json Objekt in einen entsprechenden String. Moderne Browser bringen dieses Objekt inkl. passender Methode gleich mit. In allen anderen Fällen hilft der JSON Parser / Stringifier &lt;a title="JSON in JavaScript" href="http://www.json.org/js.html" target="_blank"&gt;Json2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Das Ergebnis der Mühe sieht im Live-Betrieb dann übrigens wie folgt aus:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/5AS.NETWebformsAnwendungenundAjaxTeil4Sc_7BF4/02_AjaxRequest.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="159" alt="02_AjaxRequest" src="/images/localhost/02_AjaxRequest_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Zum Download der jQuery Library ist, wie auf der Abbildung gezeigt, ein weiterer Request notwendig, der knapp 58 kb umfasst. Dies sind fast 30 kb weniger als es im vorherigen Beispiel auf Basis des ASP.NET AJAX (client) Frameworks der Fall waren.&lt;/p&gt;

&lt;h4&gt;Fazit&lt;/h4&gt;

&lt;p&gt;Ajax Aufrufe werden mithilfe des jQuery Frameworks zum Kinderspiel. Gerade wenn man jQuery bereits für Oberflächenmanipulationen in einer Seite nutzt, lohnt sich die Anwendung von jQuery für Ajax Aufrufe anstatt der Nutzung des ASP.NET Ajax (Client) Frameworks.&lt;/p&gt;&lt;img src="http://blog.codemurai.de/aggbug/142.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andre</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/03/02/asp-net-webforms-anwendungen-und-ajax-teil-5-scriptservices-page.aspx</guid>
            <pubDate>Tue, 02 Mar 2010 00:33:55 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/03/02/asp-net-webforms-anwendungen-und-ajax-teil-5-scriptservices-page.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/142.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET Webforms Anwendungen und Ajax (Teil 4) Scriptservices, Page Methods und das ASP.NET AJAX Framework</title>
            <link>http://blog.codemurai.de/archive/2010/02/26/asp-net-webforms-anwendungen-und-ajax-teil-4-scriptservices-page.aspx</link>
            <description>&lt;p&gt;Nachdem ich in &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 1)" href="http://blog.codemurai.de/2010/01/28/ASPNETWebformsAnwendungenUndAjaxTeil1.aspx" target="_blank"&gt;Teil 1&lt;/a&gt; der Serie den manuellen Ansatz zur AJAX Implementierung gezeigt habe und in den Teilen &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 2) Client Callbacks" href="http://blog.codemurai.de/2010/02/05/ASPNETWebformsAnwendungenUndAjaxTeil2ClientCallbacks.aspx" target="_blank"&gt;2&lt;/a&gt; und &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 3) Das Updatepanel" href="http://blog.codemurai.de/2010/02/11/ASPNETWebformsAnwendungenUndAjaxTeil3DasUpdatepanel.aspx" target="_blank"&gt;3&lt;/a&gt; auf (halb-)automatische Alternativen einging, möchte ich dieses Mal einen anderen Weg zeigen, ASP.NET Scriptservices in Verbindung mit ASP.NET AJAX.&lt;/p&gt;  &lt;p&gt;Rekapitulieren wir noch einmal:&lt;/p&gt;  &lt;p&gt;&lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 1)" href="http://blog.codemurai.de/2010/01/28/ASPNETWebformsAnwendungenUndAjaxTeil1.aspx" target="_blank"&gt;Teil 1&lt;/a&gt; der Serie zeigte einen manuellen Ansatz, der hauptsächlich damit kämpfte, dass man innerhalb des JavaScript Codes selbst darauf achten musste, die verschiedenen Besonderheiten der unterschiedlichen Browser zu berücksichtigen. Dies geschah in den Teilen &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 2) Client Callbacks" href="http://blog.codemurai.de/2010/02/05/ASPNETWebformsAnwendungenUndAjaxTeil2ClientCallbacks.aspx" target="_blank"&gt;2&lt;/a&gt; und &lt;a title="ASP.NET Webforms Anwendungen und Ajax (Teil 3) Das Updatepanel" href="http://blog.codemurai.de/2010/02/11/ASPNETWebformsAnwendungenUndAjaxTeil3DasUpdatepanel.aspx" target="_blank"&gt;3&lt;/a&gt; zwar automatisch hinter den Kulissen, dafür hatten wir bei diesen Alternativen jedoch das Problem, dass bei jedem AJAX Request sowohl der komplette ViewState übertragen wurde und vor allem auf dem Server auch der komplette Page Life Cycle durchlebt wurde.&lt;/p&gt;  &lt;h2&gt;Leichtgewichtig durch die Ajax Welt&lt;/h2&gt;  &lt;p&gt;Heute möchte ich deshalb einen Ansatz zeigen, der die Vorteile der bisher vorgestellten Ansätze vereint, jedoch nicht über die selben Nachteile verfügt.&lt;/p&gt;  &lt;p&gt;Konkret bedeutet dies, dass die Implementierung auf Clientseite browserübergreifend stattfinden wird, zwischen Client und Server nur die wirklich notwendigen Daten übertragen werden und der Page Life Cycle auf der Serverseite nicht durchlaufen wird.&lt;/p&gt;  &lt;h2&gt;Page Methods&lt;/h2&gt;  &lt;p&gt;Der erste Schritt Richtung einer leichtgewichtigen Implementierung führt über die sogenannten &lt;em&gt;Page Methods&lt;/em&gt;. Page Methods sind statische Methoden einer *.aspx Seite, die mit dem &lt;em&gt;&lt;a title="Verfügbarmachen von Webdiensten für Clientskript" href="http://msdn.microsoft.com/de-de/library/bb398998.aspx" target="_blank"&gt;[WebMethod]&lt;/a&gt;&lt;/em&gt; Attribut annotiert werden. Für den Client erscheinen Page Methods wie normale Methoden eines Web Services.&lt;/p&gt;  &lt;p&gt;Ausgehend vom Beispielcode der letzten drei Teile der Serie passe ich den Servercode für die Methode, die den Inhalt einer Datei zurückliefert also wie folgt an:&lt;/p&gt;  &lt;pre class="brush: csharp"&gt;  using System.IO;
using System.Web.UI;
using System.Web.Services;

public partial class Teil4 : Page
{
	[WebMethod]
    public static string ReadStaticFile()
    {

	     string fileContent;
         using (var reader =
             new StreamReader(
                 System.Web.HttpContext.Current.Server.MapPath("~/static.html")))
         {

             fileContent = reader.ReadToEnd();
         }
         return fileContent;
     }
}&lt;/pre&gt;

&lt;p&gt;Als einzige Neuerung im Vergleich zur vorherigen Version fällt das zuvor beschriebene Attribut &lt;em&gt;[WebMethod]&lt;/em&gt; auf.&lt;/p&gt;

&lt;p&gt;Um die Methode ReadStaticFile nun clientseitig über das ASP.NET Ajax Framwork nutzen zu können, müssen wir innerhalb der *.aspx Seite bei unserem ScriptManager noch die Eigenschaft &lt;em&gt;EnablePageMethods&lt;/em&gt; mit dem Wert &lt;em&gt;true&lt;/em&gt; versehen.&lt;/p&gt;

&lt;pre class="brush: xml"&gt;&amp;lt;asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True"/&amp;gt;&lt;/pre&gt;

&lt;p&gt;Als Ergebnis rendert der Server bei einem Aufruf der Seite nun folgenden Java Script Code inline in die Seite hinein:&lt;/p&gt;

&lt;pre class="brush: js:firstline[67]"&gt; &amp;lt;script type="text/javascript"&amp;gt;
         //&amp;lt;![CDATA[
         var PageMethods = function() {

            PageMethods.initializeBase(this);
            this._timeout = 0;
            this._userContext = null;
            this._succeeded = null;
            this._failed = null;
         }
         PageMethods.prototype = {
             _get_path: function() {
                 var p = this.get_path();
                 if (p) return p;
                 else return PageMethods._staticInstance.get_path();
             },
             ReadStaticFile: function(succeededCallback, failedCallback, userContext) {
                 /// &amp;lt;param name="succeededCallback" type="Function" optional="true" mayBeNull="true"&amp;gt;&amp;lt;/param&amp;gt;
                 /// &amp;lt;param name="failedCallback" type="Function" optional="true" mayBeNull="true"&amp;gt;&amp;lt;/param&amp;gt;
                 /// &amp;lt;param name="userContext" optional="true" mayBeNull="true"&amp;gt;&amp;lt;/param&amp;gt;
                 return this._invoke(this._get_path(), 'ReadStaticFile', false, {}, succeededCallback, failedCallback, userContext);
             } 
         }
         // und vieles mehr ;-)&lt;/pre&gt;

&lt;p&gt;Wie man sieht, wird ein JavaScript Objekt &lt;em&gt;PageMethods&lt;/em&gt; angelegt, welches über eine Funktion &lt;em&gt;ReadStaticFile&lt;/em&gt; verfügt. Die Funktion hat also genau denselben Namen wie unsere serverseitige Funktion. Weiter nimmt Sie drei optionale Parameter entgegen:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;succeededCallBack&lt;/strong&gt;: Funktion, die aufgerufen wird, wenn die Ajax Anfrage &lt;em&gt;erfolgreich&lt;/em&gt; beendet wurde &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;failedCallBack&lt;/strong&gt;: Funktion, die aufgerufen wird, wenn die Ajax Anfrage &lt;em&gt;fehlerhaft&lt;/em&gt; beendet wurde &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;userContext&lt;/strong&gt;: Der Inhalt dieser Variable wird an die Funktionen succeededCallBack bzw. faildCallBack durchgereicht. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Der clientseitige Aufruf der Page Method gestaltet sich nun relativ einfach. Als erstes fügen wir der *.aspx Seite einen neuen ClientScriptBlock hinzu:&lt;/p&gt;

&lt;pre class="brush: js"&gt;&amp;lt;script type="text/javascript"&amp;gt;       
  function getStaticFile() {
    PageMethods.ReadStaticFile(onSuccess, onError, "MeinKontext");
  }

  function onSuccess(result, userContext, methodName) {
    var contentDiv = $get('content');
    if (userContext) {
      result += "&amp;lt;p&amp;gt;Der UserContext war: &amp;lt;strong&amp;gt;" + userContext + "&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;";
    }

    result += "&amp;lt;p&amp;gt;Der Methoden Name war: &amp;lt;strong&amp;gt;" + methodName + "&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;";
    contentDiv.innerHTML = result;
  } 

  function onError(result) {
    var contentDiv = $get('content');
    contentDiv.innerHTML = result;
  }

&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;p&gt;Einstiegspunkt für unseren späteren Code (Click Ereignis unseres Links) ist die Funktion &lt;em&gt;getStaticFile&lt;/em&gt;. Sie ruft die Methode &lt;em&gt;ReadStaticFile&lt;/em&gt; des Objekts &lt;em&gt;PageMethods&lt;/em&gt;. Als Argumente übergeben wir zum einen die Funktionen für die erfolgreiche bzw. fehlerhafte Behandlung der Ajax Anfrage sowie als drittes die Zeichenfolge &lt;em&gt;"MeinKontext".&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Die Funktion onSuccess ist nun die Funktion, die die (erfolgreiche) Antwort des Servers verarbeitet. Sie nimmt neben der eigentlichen Antwort des Servers, auch den zuvor übergebenen userContext entgegen. Außerdem wird der Name der aufgerufenen Servermethode im Parameter &lt;em&gt;methodName&lt;/em&gt; übergeben. Da JavaScript relativ flexibel ist, was die Anzahl der Parameter angeht und Funktionen &lt;strong&gt;einzig durch ihren Namen&lt;/strong&gt; und nicht anhand ihrer Signatur identifiziert, können die beiden letzten Parameter übrigens auch problemlos weg gelassen werden.&lt;/p&gt;

&lt;p&gt;Innerhalb der Methode onSuccess holen wir uns via &lt;em&gt;&lt;a title="Sys.UI.DomElement $get-Methode" href="http://msdn.microsoft.com/de-de/library/bb397717.aspx" target="_blank"&gt;$get&lt;/a&gt;&lt;/em&gt; zunächst eine Referenz auf das Div Element in das wir später unser Ergebnis schreiben möchten. &lt;em&gt;&lt;a title="Sys.UI.DomElement $get-Methode" href="http://msdn.microsoft.com/de-de/library/bb397717.aspx" target="_blank"&gt;$get&lt;/a&gt;&lt;/em&gt; ist übrigens eine Funktion des &lt;a title="Clientreferenz" href="http://msdn.microsoft.com/de-de/library/bb397536.aspx" target="_blank"&gt;ASP.NET Ajax Client Frameworks&lt;/a&gt;. Sie ist (vereinfacht gesagt) die Kurzschreibweise für die JavaScript Funktion &lt;em&gt;document.getElementById&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Weiter werden noch userContext (falls vorhanden) und der aufgerufene Methodenname an das Ergebnis angehangen. Im letzten Schritt wird das komplette Ergebnis schließlich in unser Container Div geschrieben.&lt;/p&gt;

&lt;p&gt;Der Aufruf  der Funktion &lt;em&gt;getStaticFile&lt;/em&gt; geschieht schließlich im Event onclick eines HTML Links (a Tag).&lt;/p&gt;

&lt;pre class="brush: xml"&gt;&amp;lt;p&amp;gt;
  &amp;lt;a href=# onclick=getStaticFile()&amp;gt;Hier klicken zum Request einer statischen Datei
  &amp;lt;/a&amp;gt;
// ....
&amp;lt;/p &amp;gt;
&amp;lt;div id=content&amp;gt;
  Bitte klicken Sie auf einen der Links, damit dieser Bereich gefüllt wird.
&amp;lt;/div&amp;gt;&lt;/pre&gt;

&lt;h2&gt;Schweres Leichtgewicht&lt;/h2&gt;

&lt;p&gt;Ruft man die Seite nun im Browser auf, fällt auf, dass neben der eigentlichen Seite auch drei JavaScript Dateien des Microsoft ASP.NET Ajax Client Frameworks geladen werden.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/01_initialerRequest.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="Erster Request der Seite" src="/images/localhost/01_initialerRequest_thumb.png" width="244" height="149" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Die erste Anfrage umfasst nun also 93 kb, von denen sich 85 kb auf die MS AJAX Script Dateien verteilen.&lt;/p&gt;

&lt;p&gt;Seinen Vorteil spielt die Herangehensweise jedoch bei den Ajax Anfragen aus. Wie man im folgenden Screenshot sieht, gehen hier gerade einmal 127 Byte über die Leitung. Weiter erkannt man deutlich, dass während des Posts kein ViewState mehr zum Server übertragen wird.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/02_ajaxpost.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="02_ajaxpost" src="/images/localhost/02_ajaxpost_thumb.png" width="244" height="28" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Auch die Antwort ist relativ schmal und beschränkt sich auf das nötigste:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/03_ajaxantwort.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="03_ajaxantwort" src="/images/localhost/03_ajaxantwort_thumb.png" width="244" height="31" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Die Antwort ist übrigens im &lt;a title="Einführung in JSON" href="http://www.json.org/json-de.html" target="_blank"&gt;JSON (Java Script Object Notation)&lt;/a&gt; Format serialisiert. Hätte unser Post Daten in Form von Argumenten für unsere Page Method enthalten, wären diese auch automatisch im JSON Format serialisiert worden. Eine etwas besser lesbare Variante der JSON formatierten Antwort enthalt der Tab JSON des Firebugs:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/04_ajaxjson.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="04_ajaxjson" src="/images/localhost/04_ajaxjson_thumb.png" width="244" height="28" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;In unserem Beispiel ist die Antwort zwar noch recht übersichtlich, so dass wir den Tab JSON eigentlich nicht benötigen würden, spätestens bei der Rückgabe komplexer Objektstrukturen lernt an den Tab jedoch schnell zu schätzen ;-)&lt;/p&gt;

&lt;h2&gt;Es geht noch besser!&lt;/h2&gt;

&lt;p&gt;Obwohl die bisherige Implementierung bereits ganz gut ist, gibt es noch zwei Kritikpunkte. Zum einen erscheint die Plazierung einer statischen Methode innerhalb der *.aspx Seite ein wenig eigenartig. Da sie weder auf &lt;strike&gt;Instanz&lt;/strike&gt; Exemplar-Felder, noch auf Exemplar-Methoden der Seite zugreifen kann, ist sie innerhalb der Seite eigentlich fehl am Platz.&lt;/p&gt;

&lt;p&gt;Außerdem stört mich der automatisch generierte JavaScript Script Block innerhalb der Seite, der die Proxies für die PageMethod Aufrufe zur Verfügung stellt. Lieber wäre mir die Variante einer eingelinkten externen JavaScript Datei.&lt;/p&gt;

&lt;p&gt;Beide Punkte können wir glücklicherweise recht einfach lösen, nämlich durch den Einsatz von Script Services. Script Services sind normale Web Services, die mit dem ScriptService Attribut annotiert werden. Erstellt man einen Web Service mit Visual Studio 2008, ist dieses Attribut sogar bereits über der Klasse enthalten. Allerdings wird es automatisch auskommentiert.&lt;/p&gt;

&lt;p&gt;Um einen Web Service nun also als Script Service zur Verfügung zu stellen, genügt es den Kommentar, wie in Zeile 13 des folgenden Listings gezeigt, zu entfernen.&lt;/p&gt;

&lt;div class="cf"&gt;
  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   11&lt;/span&gt; [&lt;span class="cb2"&gt;WebServiceBinding&lt;/span&gt;(ConformsTo = &lt;span class="cb2"&gt;WsiProfiles&lt;/span&gt;.BasicProfile1_1)]&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   12&lt;/span&gt; &lt;span class="cb8"&gt;// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. &lt;/span&gt;&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   13&lt;/span&gt; [System.Web.Script.Services.&lt;span class="cb2"&gt;ScriptService&lt;/span&gt;]&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   14&lt;/span&gt; &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;class&lt;/span&gt; &lt;span class="cb2"&gt;AjaxDemoService&lt;/span&gt; : &lt;span class="cb2"&gt;WebService&lt;/span&gt; {&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   15&lt;/span&gt; &lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   16&lt;/span&gt;     [&lt;span class="cb2"&gt;WebMethod&lt;/span&gt;]&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   17&lt;/span&gt;     &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;string&lt;/span&gt; HelloWorld() {&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   18&lt;/span&gt;         &lt;span class="cb1"&gt;return&lt;/span&gt; &lt;span class="cb5"&gt;"Hello World"&lt;/span&gt;;&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   19&lt;/span&gt;     }&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   20&lt;/span&gt; &lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   21&lt;/span&gt;     [&lt;span class="cb2"&gt;WebMethod&lt;/span&gt;]&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   22&lt;/span&gt;     &lt;span class="cb1"&gt;public&lt;/span&gt; &lt;span class="cb1"&gt;string&lt;/span&gt; Echo(&lt;span class="cb1"&gt;int&lt;/span&gt; number)&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   23&lt;/span&gt;     {&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   24&lt;/span&gt;         &lt;span class="cb1"&gt;return&lt;/span&gt; &lt;span class="cb1"&gt;string&lt;/span&gt;.Format(&lt;span class="cb5"&gt;"Sie haben {0} eingegeben."&lt;/span&gt;, number);&lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   25&lt;/span&gt;     }   &lt;/p&gt;

  &lt;p class="cl"&gt;&lt;span class="cln"&gt;   26&lt;/span&gt; }&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Prinzipiell reicht dies aus, um den Service via Ajax anzusprechen. Um uns das Leben jedoch ein wenig einfacher zu machen, lassen wir das ASP.NET Ajax Framework für uns - analog zur Page Method Lösung - JavaScript Proxies für unsere Methoden Aufrufe erstellen. Dazu fügen wir innerhalb des ScriptManager Tags der Seite ein Kind Element &lt;em&gt;&amp;lt;Services&amp;gt;&lt;/em&gt; ein. Diesem Element fügen wir als weiteres Kind Element eine &lt;em&gt;ServiceReference&lt;/em&gt; ein, deren Pfad auf unseren Service verweißt.&lt;/p&gt;

&lt;pre class="brush: xml"&gt;&amp;lt;asp:ScriptManager ID=ScriptManager1 runat=server EnablePageMethods=True&amp;gt;
  &amp;lt;Services&amp;gt;
    &amp;lt;asp:ServiceReference Path=~/AjaxDemoService.asmx /&amp;gt;
  &amp;lt;/Services&amp;gt;
&amp;lt;/asp:ScriptManager&amp;gt;&lt;/pre&gt;

&lt;p&gt;An dieser Stelle sei noch einmal darauf hingewiesen, dass dieser Schritt reine Bequemlichkeit und nicht zwingend erforderlich ist. Ohne ihn könnten wir unseren Service genauso via JavaScript rufen und würden genauso JSON als Serialisierungsformat nutzen können. Allerdings müssten wir den clientseitigen Aufruf dann komplett selbst entwickeln und hätten keine Proxies zur Verfügung.&lt;/p&gt;

&lt;p&gt;Da wir jedoch bequem sind, lassen wir uns Proxymethoden generieren. Diese können wir dann in unserem bestehenden Client Script Block innerhalb der Seite aufrufen.&lt;/p&gt;

&lt;p&gt;Wie die folgende Abbildung zeigt, erhalten wir dann sogar Intellisense und erfahren somit, welche Argumente eine bestimmte Methode entgegen nimmt.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/05_VS.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="05_VS" src="/images/localhost/05_VS_thumb.png" width="244" height="87" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Der Rest gestaltet sich ähnlich der Page Method Implementierung. Als wichtiger Unterschied wäre noch zu erwähnen, dass die generierten Proxies standardmäßig in eine externe JavaScript Datei geschrieben werden und somit nicht mehr als Client Script Block in der Seite auftauchen.&lt;/p&gt;

&lt;p&gt;Die Kommunikation zwischen Client und Server läuft analog der Page Method Implementierung.&lt;/p&gt;

&lt;p&gt;Der Client sendet in seiner Anfrage unter anderem einen Header Content-Type mit dem Wert "application/json; charset=utf-8". Dieser ist besonders wichtig, denn er steuert den Serialisierungsmechanismus des Servers. Hat dieser Header einen anderen Wert, wird die Antwort XML Serialisiert. Somit ist sichergestellt, dass JavaScript Clients JSON erhalten, wohingegen andere Clients XML erhalten.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/06_ajaxheader2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="06_ajaxheader2" src="/images/localhost/06_ajaxheader2_thumb.png" width="244" height="70" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Die nächste Abbildung zeigt, dass auch die Post Parameter via JSON serialisiert werden:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/07_ajaxpost2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="07_ajaxpost2" src="/images/localhost/07_ajaxpost2_thumb.png" width="244" height="85" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Für die Antwort ist dies natürlich auch weiterhin der Fall:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAja.NETAJAX_7339/07_ajaxantwort2.png"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="07_ajaxantwort2" src="/images/localhost/07_ajaxantwort2_thumb.png" width="244" height="41" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;Fazit:&lt;/h2&gt;

&lt;p&gt;Dieser Teil der Serie hat gezeigt, dass sich die Menge der übertragenen Daten während eines Ajax Requests mit der Hilfe von Page Methods, Script Services und dem ASP.NET Ajax Framework auf ein Minimum reduzieren lassen. Außerdem wird bei dieser Variante der ASP.NET Page Life Cycle im Gegensatz zu den vorherigen Beispielen nicht durchlaufen.&lt;/p&gt;

&lt;p&gt;Beides in Kombination kann zu gewaltigen Performancevorteilen verglichen mit Client Callbacks oder dem Updatepanel führen.&lt;/p&gt;

&lt;p&gt;Einziger Wermutstropfen ist die Übertragung der 85 kb großen ASP.NET Ajax Framework Java Script Dateien während des ersten Requests. &lt;/p&gt;

&lt;p&gt;Eine Abhilfe für dieses Problem werden wir uns im nächsten Teil der Serie ansehen.&lt;/p&gt;

&lt;p&gt;Wie immer freue ich mich natürlich über Kommentare zu diesem Blog Beitrag.&lt;/p&gt;

&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e6d57fd4-6de8-4fc6-a8f5-0ece552deb9c" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://blog.codemurai.de/tags/ASP.NET/default.aspx" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/Ajax/default.aspx" rel="tag"&gt;Ajax&lt;/a&gt;, &lt;a href="http://blog.codemurai.de/tags/Webentwicklung/default.aspx" rel="tag"&gt;Webentwicklung&lt;/a&gt; &lt;/div&gt;&lt;img src="http://blog.codemurai.de/aggbug/143.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>André Krämer</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/02/26/asp-net-webforms-anwendungen-und-ajax-teil-4-scriptservices-page.aspx</guid>
            <pubDate>Fri, 26 Feb 2010 19:30:13 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/02/26/asp-net-webforms-anwendungen-und-ajax-teil-4-scriptservices-page.aspx#feedback</comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/143.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET Webforms Anwendungen und Ajax (Teil 3) Das Updatepanel</title>
            <link>http://blog.codemurai.de/archive/2010/02/12/asp-net-webforms-anwendungen-und-ajax-teil-3-das-updatepanel.aspx</link>
            <description>&lt;p&gt;Zu Anfang hoch gelobt, später ausgepfiffen und verpönt. Was sich im ersten Moment nach der typischen Geschichte deutscher Castingshow Teilnehmer anhört, ist in Wirklichkeit das Schicksal des &lt;a title="Dokumentation des ASP.NET Updatepanels" href="http://www.asp.net/Ajax/Documentation/Live/overview/UpdatePanelOverview.aspx" target="_blank"&gt;ASP.NET AJAX Updatepanels&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Woll kaum ein anderes Control hat nach seiner Einführung einen solchen Hype verursacht und ist später so tief gefallen.&lt;/p&gt;  &lt;h4&gt;Der Reihe nach&lt;/h4&gt;  &lt;p&gt;Ehe wir im dritten Teil meiner ASP.NET Ajax Serie prüfen werden, ob das Updatepanel seinen schlechten Ruf zu recht oder unrecht hat, möchte ich zunächst jedoch kurz ein paar allgemeine Worte über das Steuerelement verlieren.&lt;/p&gt;  &lt;p&gt;Das Updatepanel kam mit den ASP.NET Ajax Extensions in der Version 1.0 für das .NET Framework 2.0 auf den Markt und musste für Visual Studio 2005 noch separat heruntergeladen und installiert werden. Ab Visual Studio 2008 ist das UpdatePanel sofort von Hause aus in der Version 3.5 des ASP.NET Ajax Frameworks enthalten.&lt;/p&gt;  &lt;p&gt;Ziel des Updatepanels ist es, ASP.NET Entwicklern die Möglichkeit zu geben Ajax zu implementieren,&lt;strong&gt; ohne selbst clientseitigen Code schreiben zu müssen&lt;/strong&gt;. Im Gegensatz zu den Client Callbacks, die ich im &lt;a href="http://blog.codemurai.de/2010/02/05/ASPNETWebformsAnwendungenUndAjaxTeil2ClientCallbacks.aspx" target="_blank"&gt;Teil 2 der Serie&lt;/a&gt; vorgestellt habe, können ASP.NET Entwickler also in Ihrer Komfortzone - dem Server - bleiben. &lt;/p&gt;  &lt;h4&gt;Der klassische Ansatz über ASP.NET Postbacks&lt;/h4&gt;  &lt;p&gt;Basis für den heutigen Blogpost wird wieder eine leicht modifizierte Variante des Beispielcodes der vorherigen &lt;a href="http://blog.codemurai.de/2010/02/05/ASPNETWebformsAnwendungenUndAjaxTeil2ClientCallbacks.aspx" target="_blank"&gt;beiden&lt;/a&gt; &lt;a href="http://blog.codemurai.de/2010/01/28/ASPNETWebformsAnwendungenUndAjaxTeil1.aspx" target="_blank"&gt;Teile&lt;/a&gt; der Serie sein. Da das Updatepanel aus Entwicklersicht rein serverseitig arbeitet, sind zunächst einige Veränderungen am bestehenden Quellcode notwendig.&lt;/p&gt;  &lt;p&gt;Zum einen sind sämtliche HTML Links (&lt;em&gt;a&lt;/em&gt; Tags) durch ASP.NET LinkButtons zu ersetzen. Außerdem habe ich den HTML Div Tag, der das Ergebnis der Click-Aktionen anzeigte, durch ein ASP.NET Literal Control ersetzt. Den zuvor in die Seite integrierten JavaScript Code des letzten Beispiels habe ich komplett entfernt.&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="background: #ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: blue"&gt;@&lt;/span&gt; &lt;span style="color: #a31515"&gt;Page&lt;/span&gt; &lt;span style="color: red"&gt;Language&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;CodeFile&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Teil3.aspx.cs&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;Inherits&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Teil2&amp;quot;&lt;/span&gt; &lt;span style="background: #ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #a31515"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: red"&gt;html&lt;/span&gt; &lt;span style="color: red"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: blue"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;html&lt;/span&gt; &lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;head&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;title&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;head&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt; &lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ASP.NET Webforms Anwendungen und Ajax (Teil3): Das Updatepanel&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;StaticLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;StaticLinkButton_Click&amp;quot;&amp;gt;&lt;/span&gt;Hier klicken zum Request einer&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; statischen Datei&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HelloWorldLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HelloWorldLinkButton_Click&amp;quot;&amp;gt;&lt;/span&gt;Hier&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; für Hello World WebService klicken&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;EchoLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;EchoLinkButton_Click&amp;quot;&amp;gt;&lt;/span&gt;Hier für Echo WebService klicken. &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Geben Sie bitte vorher eine Zahl in nebenstehendem Feld ein:&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: red"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;EchoTextBox&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;40px&amp;quot;&amp;gt;&lt;/span&gt;4711&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;contentLiteral&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;Bitte klicken Sie auf einen der Links, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; damit dieser Bereich gefüllt wird.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;html&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Serverseitig hat der Code keine &amp;#220;berraschungen parat. Je HTML Link Button gibt es einen Handler für das Click Event, in dem der Inhalt des Literal Controls gesetzt wird.&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; StaticLinkButton_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.contentLiteral.Text = &lt;span style="color: blue"&gt;this&lt;/span&gt;.ReadStaticFile();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; HelloWorldLinkButton_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.contentLiteral.Text = &lt;span style="color: blue"&gt;this&lt;/span&gt;.CallHelloWorldService();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; EchoLinkButton_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.contentLiteral.Text = &lt;span style="color: blue"&gt;this&lt;/span&gt;.CallEchoService();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; ReadStaticFile()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; fileContent;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; reader = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(Server.MapPath(&lt;span style="color: #a31515"&gt;&amp;quot;~/static.html&amp;quot;&lt;/span&gt;)))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fileContent = reader.ReadToEnd();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; fileContent;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; CallHelloWorldService()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AjaxDemoService&lt;/span&gt;().HelloWorld();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; CallEchoService()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt;.TryParse(&lt;span style="color: blue"&gt;this&lt;/span&gt;.EchoTextBox.Text, &lt;span style="color: blue"&gt;out&lt;/span&gt; value);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AjaxDemoService&lt;/span&gt;().Echo(value);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Startet man die Seite nun, sieht man dass ein GET Request auf die Seite Teil3.aspx abgesetzt wird. Die Antwort umfasst 2.1 kb.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/01ersterRequest.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="113" alt="01ersterRequest" src="/images/localhost/01ersterRequest_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Klickt man nun auf einen der Link Buttons, wird ein Postback ausgeführt und die komlette Seite neu vom Server auf den Client übertragen. Dies überrascht auch nicht, schließlich wurde noch keinerlei Ajax Funktionalität implementiert.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/02normalerPostback.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="93" alt="02normalerPostback" src="/images/localhost/02normalerPostback_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;Ein erster Versuch mit dem Updatepanel&lt;/h4&gt;  &lt;p&gt;Um die Seite nun zu &amp;quot;&lt;em&gt;ajaxifizieren&lt;/em&gt;&amp;quot;, benötigen wir zwei Controls. Das erste ist der ASP.NET Scriptmanager. Seine Hauptaufgabe ist es, Scripte zum Client zu liefern. Er muss &lt;strong&gt;vor allen AJAX Controls&lt;/strong&gt; innerhalb der Seite erscheinen. Außerdem ist noch anzumerken, dass der Scriptmanager nach dem Highlander prinzip arbeitet: &amp;quot;&lt;em&gt;Es kann nur einen geben&lt;/em&gt;!&amp;quot; - nun ja, zumindest pro Seite. Andernfalls würde zur Laufzeit eine &lt;em&gt;InvalidOperationException&lt;/em&gt; ausgelöst werden.&lt;/p&gt;  &lt;p&gt;Dies bedeutet übrigens, dass ich beim Einsatz von Masterpages keinen ScriptManager auf einer Contentseite platzieren darf, falls&amp;#160; auf der Masterpage bereits ein Scriptmanager genutzt wurde. Stattdessen müsste ich auf der Contentseite einen ScriptmanagerProxy einsetzen. Diesen benötige ich allerdings nur, falls ich auf der Contentseite deklarativ noch weitere Scripte hinzufügen möchte, die auf der Masterpage nicht gebraucht werden.&lt;/p&gt;  &lt;p&gt;Da ich langsam etwas ausschweifend werde: &lt;strong&gt;Zurück zum Thema&lt;/strong&gt;!&lt;/p&gt;  &lt;p&gt;Das zweite Control, das wir auf unserer Seite brauchen ist ein Updatepanel. Es dient als Container des Bereichs, der später aktualisiert werden soll. Updatepanels dürfen im Gegensatz zum Scriptmanager übrigens mehrfach auf einer Seite vorkommen.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/03toolbox.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="238" alt="03toolbox" src="/images/localhost/03toolbox_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nachdem ich Scriptmanager und Updatepanel auf die Seite gezogen, und die die Clientcontrols in das Updatepanel verschoben habe, sieht das Markup meiner Seite wie folgt aus.&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt; &lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptManager&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;ScriptManager1&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;ScriptManager&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ASP.NET Webforms Anwendungen und Ajax (Teil3): Das Updatepanel&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;h1&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;7&lt;/strong&gt;&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;UpdatePanel1&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;strong&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;StaticLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;StaticLinkButton_Click&amp;quot;&amp;gt;&lt;/span&gt;Hier klicken zum Request einer&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; statischen Datei&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HelloWorldLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HelloWorldLinkButton_Click&amp;quot;&amp;gt;&lt;/span&gt;Hier&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; für Hello World WebService klicken&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;EchoLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;OnClick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;EchoLinkButton_Click&amp;quot;&amp;gt;&lt;/span&gt;Hier für Echo WebService klicken. &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Geben Sie bitte vorher eine Zahl in nebenstehendem Feld ein:&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;LinkButton&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;EchoTextBox&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;40px&amp;quot;&amp;gt;&lt;/span&gt;4711&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;contentLiteral&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;Bitte klicken Sie auf einen der Links, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; damit dieser Bereich gefüllt wird.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;strong&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;strong&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Da keine Anpassungen im Code Behind meiner Seite notwendig sind, kann ich die Anwendung nun direkt starten.&lt;/p&gt;  &lt;p&gt;Ein Blick auf den Netzwerkverkehr zeigt, dass bei der ersten Anfrage der Seite neben der eigentlichen Seite noch drei JavaScript Dateien übertragen wurden. Die Verweise auf diese drei Script Dateien wurden durch den ScriptManager automatisch in die Seite eingetragen. Allerdings werden nun statt der initialen &lt;strong&gt;2.1 kb&lt;/strong&gt; knapp &lt;strong&gt;90 kb&lt;/strong&gt; zum Client übertragen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/04ersterRequestMitUpdatePanel.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="04ersterRequestMitUpdatePanel" src="/images/localhost/04ersterRequestMitUpdatePanel_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Den eigentlichen Vorteil sehen wir, sobald wir auf einen der Links klicken. Nicht nur, dass die Seite nicht komplett neu geladen wird und somit das lästige flackern beim Seitenneuaufbau entfällt, auch die Menge der übertragenen Daten hat sich auf &lt;strong&gt;1,5 kb&lt;/strong&gt; reduziert. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/05AsyncRequest1Post.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="155" alt="05AsyncRequest1Post" src="/images/localhost/05AsyncRequest1Post_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Anscheinend haben wir also alles richtig gemacht. &lt;strong&gt;Leider aber auch nur anscheinend&lt;/strong&gt;. Ein näherer Blick auf die Antwort des Servers zeigt, dass neben dem aktualisierten Inhalt auch das Markup für unsere drei Aktionslinks sowie die Textbox erneut übertragen wurden.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/06AsyncRequest1Antwort.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="169" alt="06AsyncRequest1Antwort" src="/images/localhost/06AsyncRequest1Antwort_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Das liegt daran, dass wir einen klassichen &lt;em&gt;Updatepanel Anfängerfehler&lt;/em&gt; gemacht haben. Wir haben den kompletten Inhalt der Seite in das Updatepanel geschoben. Somit wird dieser auch vollkommen korrekt wieder vollständig vom Server zum Client übertragen.&lt;/p&gt;  &lt;p&gt;Das ist selbstverständlich nicht das, was wir wollten. Schließlich ist unsere Ajax Implementierung nur augenwischerei wenn im Hintergrund doch wieder (fast) alles zum Client übertragen wird.&lt;/p&gt;  &lt;h4&gt;Ein zweiter Anlauf&lt;/h4&gt;  &lt;p&gt;Was können wir also tun? Nun, da wir nur den Inhalt des Steuerelements &lt;em&gt;contentLiteral&lt;/em&gt; aktualisieren möchten, sollten wir offensichtlich auch nur diesen in das Updatepanel aufnehmen. Dazu schieben wir einfach die drei Aktionslinks wieder über das Updatepanel.&lt;/p&gt;  &lt;p&gt;Wenn wir die Seite nun starten, stellen wir jedoch fest, dass ein Klick auf einen der Aktionslinks wieder einen vollständigen Postback inklusive komplettem Rendern der Seite auslöst.&lt;/p&gt;  &lt;p&gt;Die Ursache hierfür ist, dass ein Updatepanel standardmäßig nur einen partiellen Postback verursacht und sich somit erneuert, wenn eines seiner Childcontrols einen Postback initiert.&lt;/p&gt;  &lt;p&gt;Glücklicherweise lässt sich dieses Verhalten jedoch leicht ändern. Für jedes Updatepanel können sogenannte Trigger registriert werden, die einen partiellen Postback auslösen. Ein Trigger ist dabei nichts anderes, als ein Event eines Servercontrols.&lt;/p&gt;  &lt;p&gt;Das Registrieren eines solchen Triggers kann entweder über den Designer oder über das ASP.NET Markup geschehen. Um es über das Markup zu lösen, müssen wir unser Beispiel wie folgt anpassen:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;UpdatePanel1&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;contentLiteral&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;Bitte klicken Sie auf einen der Links, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; damit dieser Bereich gefüllt wird.&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Triggers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;AsyncPostBackTrigger&lt;/span&gt; &lt;span style="color: red"&gt;ControlID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;StaticLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;EventName&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;AsyncPostBackTrigger&lt;/span&gt; &lt;span style="color: red"&gt;ControlID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;HelloWorldLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;EventName&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;AsyncPostBackTrigger&lt;/span&gt; &lt;span style="color: red"&gt;ControlID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;EchoLinkButton&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;EventName&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;Click&amp;quot;&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Triggers&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Lädt man die Seite nun erneut, stellt man fest, dass die Aktionslinks wieder partielle Postbacks auslösen. Außerdem werden auch nur die notwendigen Daten übertragen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/07AsyncRequest2Antwort.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="129" alt="07AsyncRequest2Antwort" src="/images/localhost/07AsyncRequest2Antwort_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Zu viel des Guten&lt;/h4&gt;  &lt;p&gt;Das Ergebnis sieht eigentlich schon ganz gut, so das man meinen könnte, dass wir nun fertig wären. Leider gibt es aber noch ein kleines Problem. Um dies zu verdeutlichen lege ich ein weiteres Updatepanel auf der Seite an. Dieses Panel erhält ein Literal-Control, welches serverseitig mit der aktuellen Uhrzeit gefüllt wird.&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;UpdatePanel2&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TimeLiteral&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;Literal&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ContentTemplate&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;UpdatePanel&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.TimeLiteral.Text = &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.ToLongTimeString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Meine Erwartungshaltung wäre, dass bei einem Klick auf einen der drei Aktionslinks nur das ursprüngliche Updatepanel aktualisiert wird, da die Links nur hier als Trigger registriert wurden. Das neue Updatepanel sollte nicht aktualisiert werden.&lt;/p&gt;  &lt;p&gt;Ein kurzer Test zeigt dass dem nicht so ist:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/08_2UpdatePanels1.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="116" alt="08_2UpdatePanels1" src="/images/localhost/08_2UpdatePanels1_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/08_2UpdatePanels2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="109" alt="08_2UpdatePanels2" src="/images/localhost/08_2UpdatePanels2_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Wie die beiden Abbildungen zeigen, wurde nicht nur der Bereich des ersten Updatepanels, sondern auch der des zweiten Updatepanels aktualisiert.&lt;/p&gt;  &lt;p&gt;Glücklicherweise lässt sich dieses Verhalten jedoch steuern! Das Updatepanel verfügt über eine Eigenschaft &lt;em&gt;UpdateMode&lt;/em&gt;. Diese gibt an, wann sich das Updatepanel aktualisieren soll. Standardmässig ist diese Eigenschaft mit dem Wert &lt;em&gt;Always&lt;/em&gt; belegt. Stellt man den Wert jedoch auf &lt;em&gt;Contidional&lt;/em&gt;, wird das Updatepanel nur noch aktualisiert, wenn entweder eines seiner Childcontrols einen Postback initiert hat, einer der registrierten Trigger ausgelöst wurde, oder explizit die Methode &lt;em&gt;Update&lt;/em&gt; serverseitig gerufen wurde.&lt;/p&gt;  &lt;p&gt;Die folgenden Abbildungen zeigen die Auswirkung der &amp;#196;nderung des UpdateModes:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/08_2UpdatePanels3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="133" alt="08_2UpdatePanels3" src="/images/localhost/08_2UpdatePanels3_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/08_2UpdatePanels4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="170" alt="08_2UpdatePanels4" src="/images/localhost/08_2UpdatePanels4_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil3Da_7B57/08_2UpdatePanels5.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="171" alt="08_2UpdatePanels5" src="/images/localhost/08_2UpdatePanels5_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Fazit&lt;/h4&gt;  &lt;p&gt;&lt;strong&gt;Richtig eingesetzt&lt;/strong&gt; ist das Updatepanel meiner Meinung nach besser als sein Ruf und für &lt;strong&gt;einfache Szenarien&lt;/strong&gt; durchaus geeignet. Ajax Funktionalitäten können mit wenig Aufwand und ohne manuellen Scriptcode implementiert werden.&lt;/p&gt;  &lt;p&gt;Achtet man darauf, nicht die komplette Seite in &lt;strong&gt;ein&lt;/strong&gt; Updatepanel zu integrieren und den &lt;em&gt;UpdateMode&lt;/em&gt; auf &lt;em&gt;Conditional&lt;/em&gt; zu setzen, kann das Updatepanel in vielen Szenarien guten Gewissens genutzt werden. Man sollte sich allerdings darüber im Klaren sein, dass serverseitig bei jeder Anfrage &lt;strong&gt;der komplette Page-Life&lt;/strong&gt;cycle durchlaufen wird. Zeitaufwändige Operationen im Page_Load können - ähnlich wie bei den Client Callbacks - die Ajax Anfragen demnach erheblich verlangsamen!&lt;/p&gt;  &lt;p&gt;Was man machen kann, wenn man den Pagelifecycle nicht komplett durchlaufen möchte, werde ich übrigens im nächsten Teil dieser Serie zeigen.&lt;/p&gt;&lt;img src="http://blog.codemurai.de/aggbug/144.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andre</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/02/12/asp-net-webforms-anwendungen-und-ajax-teil-3-das-updatepanel.aspx</guid>
            <pubDate>Fri, 12 Feb 2010 01:51:55 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/02/12/asp-net-webforms-anwendungen-und-ajax-teil-3-das-updatepanel.aspx#feedback</comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/144.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET Webforms Anwendungen und Ajax (Teil 2) Client Callbacks</title>
            <link>http://blog.codemurai.de/archive/2010/02/05/asp-net-webforms-anwendungen-und-ajax-teil-2-client-callbacks.aspx</link>
            <description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;In meinem &lt;a href="http://blog.codemurai.de/2010/01/28/ASPNETWebformsAnwendungenUndAjaxTeil1.aspx" target="_blank"&gt;letzten Blog Eintrag&lt;/a&gt; habe ich erklärt, wie Ajax von Hand mit Hilfe des XMLHttpRequest Objekts implementiert werden kann. &lt;/p&gt;  &lt;p&gt;Eine Alternative zu dieser händischen Implementierung ist die Nutzung des ASP.NET Client &lt;a href="http://msdn.microsoft.com/en-us/library/ms178208.aspx" target="_blank"&gt;Callback Frameworks&lt;/a&gt;, welches mit der Version 2.0 von ASP.NET erschien.&lt;/p&gt;  &lt;p&gt;Um Client Callbacks nutzen zu können muss eine ASP.NET Seite bzw. ein ASP.NET Control das Interface &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.icallbackeventhandler.aspx" target="_blank"&gt;ICallbackEventHandler&lt;/a&gt;&lt;/em&gt; implementieren. Das Interface definiert die beiden Methoden:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;void &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.icallbackeventhandler.raisecallbackevent.aspx" target="_blank"&gt;RaiseCallbackEvent&lt;/a&gt;&lt;/em&gt;(string eventArgument) &lt;/li&gt;    &lt;li&gt;string &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.icallbackeventhandler.getcallbackresult.aspx" target="_blank"&gt;GetCallbackResult&lt;/a&gt;&lt;/em&gt;() &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;em&gt;RaiseCallbackEvent&lt;/em&gt; ist die Methode, den Aufruf des Clients entgegen nimmt. &lt;em&gt;GetCallbackResult&lt;/em&gt; gibt das Ergebnis der serverseitigen Verarbeitung an den Client zurück.&lt;/p&gt;  &lt;p&gt;Startet der Client eine Anfrage an eine Seite / ein Control welches &lt;em&gt;ICallBackEventHandler&lt;/em&gt; implementiert, wird eine &lt;a href="http://edndoc.esri.com/arcobjects/9.2/NET_Server_Doc/developer/ADF/ajax_callback.htm" target="_blank"&gt;reduzierte Variante&lt;/a&gt; des &lt;a href="http://msdn.microsoft.com/en-us/library/ms178472.aspx" target="_blank"&gt;ASP.NET Page Lifecycle&lt;/a&gt; / ASP.NET Control Lifecycle ausgeführt. Im wesentlichen entspricht die Callback Variante der &amp;quot;klassichen&amp;quot; Postback Variante, es fehlen jedoch die Methoden, die sich um das Rendering des Outputs kümmern. Außerdem werden keine Postback Events ausgeführt.&lt;/p&gt;  &lt;p&gt;Das ganze sieht bezogen auf die Phasen also ungefähr so aus:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil2Cl_68C4/04lifecycle.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="223" alt="04lifecycle" src="/images/localhost/04lifecycle_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Los gehts&lt;/h4&gt;  &lt;p&gt;Sehen wir uns das ganze nun einmal an einem konkreten Beispiel an. Als Ausgangsbasis soll eine modifizierte Kopie der Seite des letzten Beispiels mit folgendem Markup dienen:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt;&amp;gt;Hier klicken zum Request einer&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; statischen Datei &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Hier für Hello World WebService klicken &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Hier&lt;span style="color: #2b91af"&gt; &lt;/span&gt;für Echo WebService klicken. Geben Sie bitte vorher eine Zahl in nebenstehendem Feld ein: &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: red"&gt;&amp;amp;nbsp;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox&lt;/span&gt; &lt;span style="color: red"&gt;ID&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;TextBox1&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;Width&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;40px&amp;quot;&amp;gt;&lt;/span&gt;4711&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;asp&lt;/span&gt;&lt;span style="color: blue"&gt;:&lt;/span&gt;&lt;span style="color: #a31515"&gt;TextBox&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt; &lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;content&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Bitte klicken Sie auf einen der Links, damit dieser Bereich gefüllt wird.&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;&amp;#160;&lt;/h3&gt;  &lt;h3&gt;Der Server&lt;/h3&gt;  &lt;p&gt;Auf Serverseite müssen wir nun in unserer Seite das Interface ICallbackEventHandler implementieren. Ausgehend von unserem Markup gilt es drei Operationen zu unterstützen:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Zurückgeben des Inhalts einer statischen Datei &lt;/li&gt;    &lt;li&gt;Aufruf einer parameterlosen Methode eines Webservices, die &amp;quot;Hello World&amp;quot; zurück gibt &lt;/li&gt;    &lt;li&gt;Aufruf einer Methode &lt;em&gt;Echo&lt;/em&gt; eines Webservices, welche einen numerischen Wert entgegen nimmt und einen String zurück gibt. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Welche Operation auszuführen ist, unterscheiden wir anhand des einzigen Arguments der Methode &lt;em&gt;RaiseCallbackEvent&lt;/em&gt;: &lt;em&gt;eventArgument&lt;/em&gt;.&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Teil2&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;ICallbackEventHandler&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; callbackResult;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; RaiseCallbackEvent(&lt;span style="color: blue"&gt;string&lt;/span&gt; eventArgument)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;switch&lt;/span&gt; (eventArgument)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;static&amp;quot;&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.ReadStaticFile();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;HelloWorld&amp;quot;&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.CallHelloWorldService();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;Echo&amp;quot;&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.CallEchoService();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;default&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.ReturnUnknownOperationError();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetCallbackResult()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;.callbackResult;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Je nach Wert des Arguments eventArgument wird eine andere Methode zur weiteren Verarbeitung aufgerufen. Jede dieser Methoden schreibt ihr Ergebnis wiederum in das Feld &lt;em&gt;callbackResult&lt;/em&gt;. Dieses wird wiederum als Ergebnis der Methode &lt;em&gt;GetCallbackResult&lt;/em&gt; an den Client zurück gegeben.&lt;/p&gt;  &lt;p&gt;Der Inhalt der verarbeitenden Methoden sieht wie folgt aus:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Auslesen der statischen Datei:&lt;/strong&gt;&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ReadStaticFile()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; reader = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StreamReader&lt;/span&gt;(Server.MapPath(&lt;span style="color: #a31515"&gt;&amp;quot;~/static.html&amp;quot;&lt;/span&gt;)))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.callbackResult = reader.ReadToEnd();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Aufruf der Methode HelloWorld des Webservices:&lt;/strong&gt;&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; CallHelloWorldService()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.callbackResult = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AjaxDemoService&lt;/span&gt;().HelloWorld();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Aufruf der Methode Echo des Webservices:&lt;/strong&gt;&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; CallEchoService()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt; value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;int&lt;/span&gt;.TryParse(&lt;span style="color: blue"&gt;this&lt;/span&gt;.TextBox1.Text, &lt;span style="color: blue"&gt;out&lt;/span&gt; value);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;this&lt;/span&gt;.callbackResult = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AjaxDemoService&lt;/span&gt;().Echo(value);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Wie man beim Aufruf der Webservice Methoden sieht, geschieht dieser Aufruf nun vom &lt;strong&gt;Server&lt;/strong&gt; aus und nicht vom &lt;strong&gt;Client&lt;/strong&gt;. Dadurch dass im Gegensatz zum vorherigen Beispiel der Client nun nicht mehr direkt den Service ruft, musste ich mir einen Proxy auf Serverseite erstellen.&lt;/p&gt;  &lt;h4&gt;Schön, aber wie komme ich nun auf den Server?&lt;/h4&gt;  &lt;p&gt;Bisher haben wir zwar geklärt, was auf dem Server alles geschehen muss, damit Client Callbacks funktionieren, offen ist allerdings noch, wie man überhaupt vom Client auf den Server kommt.&lt;/p&gt;  &lt;p&gt;Der Aufruf des Servers geschieht über die JavaScript Funktion &lt;em&gt;WebForm_DoCallback&lt;/em&gt;. Einen entsprechenden Aufruf der Methode kann man sich über den &lt;em&gt;ClientScriptManager&lt;/em&gt; der Seite anhand der Methode &lt;em&gt;GetCallbackEventReference&lt;/em&gt; erzeugen lassen. &lt;strong&gt;Zeile 5&lt;/strong&gt; des folgenden Listing demonstriert dies.&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; clientScript = Page.ClientScript;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; callbackReference =&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; clientScript.GetCallbackEventReference(&lt;span style="color: blue"&gt;this&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;argument&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;requestFinished&amp;quot;&lt;/span&gt;, &lt;span style="color: #a31515"&gt;&amp;quot;context&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; script = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;function sendAjaxRequest(argument, context){{\n {0}; }}&amp;quot;&lt;/span&gt;, callbackReference);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!clientScript.IsClientScriptBlockRegistered(&lt;span style="color: #a31515"&gt;&amp;quot;callback&amp;quot;&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; clientScript.RegisterClientScriptBlock(&lt;span style="color: blue"&gt;this&lt;/span&gt;.GetType(), &lt;span style="color: #a31515"&gt;&amp;quot;callback&amp;quot;&lt;/span&gt;, script, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Die Methode GetCallbackEventReference hat in der höchsten &amp;#220;berladung folgende Parameter:&lt;/p&gt;  &lt;table style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" cellspacing="0" cellpadding="2"&gt;&lt;thead&gt;     &lt;tr&gt;       &lt;th valign="top" width="150"&gt;&amp;#160;&lt;/td&gt; Parameter&lt;/th&gt;        &lt;th valign="top"&gt;Bedeutung&lt;/th&gt;     &lt;/tr&gt;   &lt;/thead&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="150"&gt;control&lt;/td&gt;        &lt;td valign="top"&gt;Servercontrol, dass den Callback behandelt.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="150"&gt;argument&lt;/td&gt;        &lt;td valign="top"&gt;Argument, das an die Methode RaiseCallbackEvent des behandelnden Controls geschickt wird.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="150"&gt;clientCallback&lt;/td&gt;        &lt;td valign="top"&gt;Name der Javascript Funktion, die die Rückgabe des Servers im Erfolgsfall behandelt.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="150"&gt;context&lt;/td&gt;        &lt;td valign="top"&gt;Javascsript Code, der ausgeführt wird, ehe die Anfrage an den Server geschickt wird. Achtung, hierbei handelt es sich nicht um einen JavaScript String, sondern um einen Befehl / eine Funktion&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="150"&gt;clientErrorCallback&lt;/td&gt;        &lt;td valign="top"&gt;Name der Javascript Funktion, die die Rückgabe des Servers im Fehlerfall behandelt. In meinem Beispiel habe ich diesen Paramter nicht gesetzt.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="150"&gt;useAsync&lt;/td&gt;        &lt;td valign="top"&gt;Boolscher Wert, der angibt, ob die Anfrage asynchron (true) oder synchron (false) abgesetzt werden soll.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Der Einfachheit halber verpackt man den generierten Aufruf der Methode &lt;em&gt;WebForm_DoCallback&lt;/em&gt; in eine eigene JavaScript Funktion, die nur noch die wirklichen variablen Parameter &lt;em&gt;argument&lt;/em&gt; und &lt;em&gt;context&lt;/em&gt; entgegen nimmt, wie in &lt;strong&gt;Zeile 7&lt;/strong&gt; geschehen. Anschließend registriert man wie in &lt;strong&gt;Zeile 9 - 11&lt;/strong&gt; noch einen ClientScriptBlock für diese Funktion, der wie folgt in die Seite gerendert wird.&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt; &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;//&amp;lt;![CDATA[&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;function&lt;/span&gt; sendAjaxRequest(argument, context) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; WebForm_DoCallback(&lt;span style="color: #a31515"&gt;'__Page'&lt;/span&gt;, argument, requestFinished, context, &lt;span style="color: blue"&gt;null&lt;/span&gt;, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;span style="color: green"&gt;//]]&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Die generierte Methode &lt;em&gt;sendAjaxRequest&lt;/em&gt; kann man anschließend wie folgt aufrufen:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;sendAjaxRequest('static', showMessage());&amp;quot;&amp;gt;&lt;/span&gt;Hier klicken zum Request einer&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; statischen Datei &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;sendAjaxRequest('HelloWorld', '');&amp;quot;&amp;gt;&lt;/span&gt;Hier&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; für Hello World WebService klicken &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;sendAjaxRequest('Echo', null);&amp;quot;&amp;gt;&lt;/span&gt;Hier&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; für Echo WebService klicken. Geben Sie bitte vorher eine Zahl in &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; nebenstehendem Feld ein: &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Zeile 1 zeigt, wie der Parameter &lt;em&gt;context&lt;/em&gt; genutzt wird. Ich übergebe einfach die JavaScript Funktion &lt;em&gt;showMessage&lt;/em&gt; als Argument. Diese wird nun automatisch aufgerufen, ehe der Request gestartet wird. Dies ist zum Beispiel bei länger dauernden Ajax Aufrufen sinnvoll, bei denen man dem Benutzer einen Hinweis anzeigen möchte, wie folgendes Listing zeigt:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt; &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;function&lt;/span&gt; showMessage() {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; contentDiv = document.getElementById(&lt;span style="color: #a31515"&gt;'content'&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contentDiv.innerHTML = &lt;span style="color: #a31515"&gt;'Lade...'&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Wichtig ist, dass der Parameter &lt;strong&gt;keinen String&lt;/strong&gt; entgegen nimmt (wie leider in vielen Beispielen fälschlicherweise gezeigt), sondern eine JavaScript Funktion!&lt;/p&gt;  &lt;p&gt;Eigentlich Interessant für unser Beispiel ist jedoch nicht der Parameter &lt;em&gt;context&lt;/em&gt;, sonder der Parameter &lt;em&gt;argument&lt;/em&gt;. Der Inhalt dieses Parameters (und nur dieser!) wird an die Methode &lt;em&gt;RaiseCallbackEvent&lt;/em&gt; des Servers übergeben. Er steuert somit die auszuführende Funktionalität.&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Alles beim Alten?&lt;/h4&gt;  &lt;p&gt;Spielt man nun ein wenig mit der vorgestellten Lösung herum, bemerkt man schnell, dass der Aufruf der Methode Echo stets ausgibt, das man &lt;em&gt;4711&lt;/em&gt; eingegeben hat - auch wenn der Wert der Textbox zwischenzeitlich geändert wurde.&lt;/p&gt;  &lt;p&gt;Ursache hierfür ist, dass ASP.NET Client Callbacks für alle Formularfelder stets die initialen Werte zurücksendet.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil2Cl_68C4/01alterpost.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="161" alt="Screenshot der Beispielanwendung" src="/images/localhost/01alterpost_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Abhilfe schafft folgender JavaScript Code:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt; __theFormPostData = &lt;span style="color: #a31515"&gt;''&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; WebForm_InitCallback();&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Diesen packt man einfach in eine JavaScript Funktion, z. B. mit dem Namen &lt;em&gt;repostForm&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Gibt man diese nun als context während des Aufrufs an:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;sendAjaxRequest('Echo', repostForm());&amp;quot;&amp;gt;&lt;/span&gt;Hier [...]&lt;/p&gt; &lt;/div&gt;  &lt;p&gt; werden auch die geänderten Eingaben des Benutzers übertragen.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil2Cl_68C4/02neuerpost.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="153" alt="Screenshot zeigt dass die geänderten Werte übertragen wurden" src="/images/localhost/02neuerpost_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Fazit&lt;/h4&gt;  &lt;p&gt;ASP.NET Client Callbacks sind eine schnelle und einfache Lösung um Ajax Funktionalitäten unter ASP.NET ab der Version 2.0 zu implementieren.&lt;/p&gt;  &lt;p&gt;Bei aller Einfachheit sollte man jedoch beachten, dass diese Lösung auch einige Schwächen hat:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Auf dem Server wird fast der komplette Page Lifecycle ausgeführt. Daher sollten Codebestandteile, die bei einem Callback nicht zwingend ausgeführt werden müssen immer durch ein &lt;em&gt;if(!Page.IsCallback)&lt;/em&gt; ... geklammert werden, um unnötige Wartezeiten zu verhindern.&lt;/li&gt;    &lt;li&gt;Bei jedem Callback wird der komplette Viewstate zum Server übertragen. Gerade bei großem Viewstate und schlechter Internetanbindung verlangsamt dieser Umstand die Ajax Anfrage enorm.&lt;/li&gt;    &lt;li&gt;Es kann immer nur ein Argument an den Server übergeben werden. Möchte man mehr als eins übergeben, muss man die Werte durch ein Trennzeichen trennen und auf der Serverseite auseinanderpflücken&lt;/li&gt;    &lt;li&gt;Das übergebene Argument wird nicht wieder vom Server auf den Client zurück übertragen. Somit ist es in der verarbeitenden Javascript Funktion auf dem Client unmöglich herauszufinden, welche Operation ursprünglich gestartet wurde. Abhilfe schafft auch hier ein zusammengesetzter Rückgabewert, oder aber eine eigene verarbeitende Funktion je Operation.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Hat man diese Schwächen jedoch im Blick, lassen sich mit ASP.NET Client Callbacks wunderbare Ajax Applikationen implementieren.&lt;/p&gt;  &lt;p&gt;Unter der Haube arbeiten diese Client Callbacks übrigens genauso wie das händische Beispiel aus dem letzten Blogpost - nämlich mit dem XMLHttpRequest Objekt:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil2Cl_68C4/03unterderhaube.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="150" alt="Screenshot des JavaScript Debuggers, zeigt Zugriff auf XMLHttpRequest Objekt" src="/images/localhost/03unterderhaube_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blog.codemurai.de/aggbug/145.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andre</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/02/05/asp-net-webforms-anwendungen-und-ajax-teil-2-client-callbacks.aspx</guid>
            <pubDate>Fri, 05 Feb 2010 02:20:23 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/02/05/asp-net-webforms-anwendungen-und-ajax-teil-2-client-callbacks.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/145.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET Webforms Anwendungen und Ajax (Teil 1)</title>
            <link>http://blog.codemurai.de/archive/2010/01/29/asp-net-webforms-anwendungen-und-ajax-teil-1.aspx</link>
            <description>&lt;p&gt;Das man mit statischen, oder auch dyanamischen Seiten, die bei jeder Anfrage die komplette Seite neu aufbauen, heute keinen Blumentopf mehr gewinnt, dürfte jedem klar sein. Verwöhnt durch Webanwendungen wie zum Beispiel Google-Maps oder Outlook Web Access erwarten Endanwender Webanwendungen, die einen ähnlichen Bedienkomfort wie Desktop Anwendungen aufweisen.&lt;/p&gt;  &lt;p&gt;Als Entwickler solcher Webanwendungen bringt uns dies in die Situation, dass wir unsere Entwicklungstätigkeiten nun nicht mehr rein auf den Server beschränken können, sondern auch auf dem Client aktiv werden müssen, um die hohen Erwartungen unserer Anwender zu erfüllen.&lt;/p&gt;  &lt;p&gt;Was &lt;em&gt;&amp;quot;auf dem Client aktiv werden&amp;quot;&lt;/em&gt; konkret bedeutet möchte ich in einer kleinen Artikelreihe in meinem Blog beantworten.&lt;/p&gt;  &lt;h4&gt;Der Client - das unbekannte Wesen&lt;/h4&gt;  &lt;p&gt;Heutzutage sind eine Reihe &lt;em&gt;Ajax Frameworks&lt;/em&gt; verfügbar, die uns die &lt;em&gt;&amp;quot;schmutzige&amp;quot;&lt;/em&gt; Arbeit auf dem Weg zur dynamischen Webseite abnehmen wollen. Da es meiner Meinung nach aber nie schaden kann, wenn man weiss was diese magischen Toolsets und Frameworks unter der Haube machen, werden wir heute die &amp;#196;rmel hoch krempeln und die &lt;em&gt;&amp;quot;Drecksarbeit&amp;quot;&lt;/em&gt; auf dem Client selbst erledigen. &lt;/p&gt;  &lt;p&gt;Ehe wir los legen, sollten wir zuvor jedoch einen Blick auf die notwendigen Zutaten werfen und kurz klären, worum es sich dabei im einzelnen handelt.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;       &lt;p&gt;&lt;em&gt;Das &lt;strong&gt;J&lt;/strong&gt; in A&lt;strong&gt;J&lt;/strong&gt;AX. Eine von vielen Entwicklern zu unrecht gefürchtete und/oder belächelte Client Script Sprache ;-) Der Scriptcode wird entweder direkt in eine Seite eingebettet, oder aber in eine externe Datei ausgelagert. JavaScript wird zur Manipulation des DOM genutzt&lt;/em&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;das &lt;strong&gt;Document Object Model (DOM)&lt;/strong&gt; des Browsers&amp;#160; &lt;p&gt;&lt;em&gt;Das DOM des Browsers ist eine Schnittstelle, die den Zugriff auf das zugrundeliegende (X)HTML Dokument bereitstellt. &amp;#220;ber das DOM habe ich die Möglichkeit, Aussehen und Struktur der einer Webseite zu verändern.&lt;/em&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;das &lt;strong&gt;XMLHttpRequest&lt;/strong&gt; Objekt       &lt;p&gt;&lt;em&gt;Eines der Objekte des window Objekts des Browsers(zumindest in modernen Browsern. Andernfalls ein ActiveX Objekt). Es ermöglicht einem Script das Absetzen einer (asynchronen) Anfrage an einen Webserver.&lt;/em&gt;&amp;#160;&lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Im &amp;#220;berblick sieht das Zusammenspiel der drei Komponenten ungefähr so aus:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil1_7DDD/ueberblick.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="116" alt="Zusammenspiel zwischen JavaScript, DOM und XMLHttpRequest" src="/images/localhost/ueberblick_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Los gehts!&lt;/h4&gt;  &lt;p&gt;Wir wissen zwar jetzt, was wir alles brauchen, allerdings fehlt immer noch die Antwort, wie die Komponenten nun genutzt werden müssen, um AJAX in die eigene Webseite zu bekommen.&lt;/p&gt;  &lt;p&gt;Starten wir dazu mit einem kleinen und sehr einfachen Beispiel. &lt;/p&gt;  &lt;p&gt;Wir erstellen eine einfache ASPX Seite, die aus einem Link und einem Platzhalter Bereich bestehen soll. Sobald der Anwender auf den Link klickt, soll dieser Platzhalter mit dem Inhalt einer statischen Datei, welche auf dem Server liegt, gefüllt werden.&lt;/p&gt;  &lt;p&gt;Der zugehörige HTML Code der ASPX Seite sieht wie folgt aus:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt; &lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;runat&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;Hier klicken zum Request einer&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; statischen Datei &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;p&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt; &lt;span style="color: red"&gt;id&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;content&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Bitte klicken Sie den Link, damit dieser Bereich gefüllt wird.&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;div&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;form&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Der Link, welcher später die Ajax Aktion initiieren soll, wird in den Zeilen 5 und 6 definiert. Der Bereich welcher später ersetzt werden soll, ist der Inhalt des DIV Tags aus Zeile 9.&lt;/p&gt;  &lt;p&gt;Noch ist das ganze jedoch nicht sonderlich dynamisch. Dazu benötigen wir noch etwas JavaScript:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt; &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; xmlHttp;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; window.onload = &lt;span style="color: blue"&gt;function&lt;/span&gt;() {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; initializeXmlHttp();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;function&lt;/span&gt; initializeXmlHttp() {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (window.XMLHttpRequest) { &lt;span style="color: green"&gt;// IE7, IE8, Mozilla, Safari, Opera&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp = &lt;span style="color: blue"&gt;new&lt;/span&gt; XMLHttpRequest();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (window.ActiveXObject) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;try&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp = &lt;span style="color: blue"&gt;new&lt;/span&gt; ActiveXObject(&lt;span style="color: #a31515"&gt;&amp;quot;Microsoft.XMLHTTP&amp;quot;&lt;/span&gt;); &lt;span style="color: green"&gt;//IE 5.x, 6&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;catch&lt;/span&gt; (e) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; alert(&lt;span style="color: #a31515"&gt;'Ajax Zugriffe sind aufgrund der aktuellen Sicherheitseinstellungen leider nicht möglich'&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;function&lt;/span&gt; sendAjaxRequest(url) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (xmlHttp) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp.open(&lt;span style="color: #a31515"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;, url, &lt;span style="color: blue"&gt;true&lt;/span&gt;); &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp.onreadystatechange = requestFinished;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp.send(&lt;span style="color: blue"&gt;null&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;function&lt;/span&gt; requestFinished() {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (xmlHttp.readyState==4) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (xmlHttp.status==200) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; contentDiv = document.getElementById(&lt;span style="color: #a31515"&gt;'content'&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; contentDiv.innerHTML = xmlHttp.responseText;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;script&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Das Script deklariert zunächst in &lt;strong&gt;Zeile 2&lt;/strong&gt; eine Variable, die einen Verweis auf das &lt;em&gt;XMLHhtpRequest&lt;/em&gt; Objekt hält. Wie zuvor beschrieben ermöglicht dieses das Absetzen einer asynchronen Abfrage an den Server.&lt;/p&gt;  &lt;p&gt;Die Funktion &lt;em&gt;initializeXmlHttp&lt;/em&gt; ab &lt;strong&gt;Zeile 7&lt;/strong&gt; füllt dieses Objekt nun mit Leben. Der Code sollte recht selbsterklärend sein. Zeile 8 prüft, ob das XMLHttpRequest Objekt am window Objekt hängt. Falls ja, kann ein neues XMLHttpRequest Objekt erstellt werden. Ist dies nicht der Fall, muss es als ActiveX Objekt erstellt werden.&lt;/p&gt;  &lt;p&gt;Die Funktion &lt;em&gt;sendAjaxRequest&lt;/em&gt; ab &lt;strong&gt;Zeile 20&lt;/strong&gt; setzt die eigentliche Abfrage ab. Dazu prüft Sie in Zeile 21 zuerst, ob die Variable xmlHttp initialisiert werden konnte. Wäre dies nicht der Fall, könnte keine Abfrage abgesandt werden. Anschließend wird in &lt;strong&gt;Zeile 22&lt;/strong&gt; eine asynchrone Verbindung geöffnet mit der Methode &lt;em&gt;open &lt;/em&gt;geöffnet. Diese Methode erhält als Parameter die Methode (&amp;quot;GET&amp;quot; oder &amp;quot;POST&amp;quot;), die URL, sowie ein Flag, ob die Anfrage asynchron abgesetzt werden soll.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Zeile 23&lt;/strong&gt; gibt eine CallBack-Funktion an (in unserem Fall requestFinished), die aufgerufen werden soll, sobald eine Antwort auf die Anfrage zurück gekommen ist.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Zeile 24&lt;/strong&gt; sendet die Anfrage nun schließlich ab.&lt;/p&gt;  &lt;p&gt;Die Funktion &lt;em&gt;requestFinished&lt;/em&gt; ab &lt;strong&gt;Zeile 28&lt;/strong&gt; verarbeitet die Antwort des Webservers. Da eine Anfrage verschiedene Phasen durchlebt, prüft die Funktion in &lt;strong&gt;Zeile 29&lt;/strong&gt; anhand der Eigenschaft &lt;em&gt;readyState&lt;/em&gt; ab, ob die Anfrage tatsächlich komplett beendet wurde.&lt;/p&gt;  &lt;p&gt;Da zu Ende nicht immer &amp;quot;hat auch geklappt&amp;quot; heißen muss, wird in der nächsten Zeile geprüft, ob die Anfrage auch erfolgreich beendet wurde (HTTP Statuscode 200).&lt;/p&gt;  &lt;p&gt;Die eigentliche Verarbeitung findet nun in den &lt;strong&gt;Zeilen 31 und 32&lt;/strong&gt; statt. &lt;strong&gt;Zeile 31&lt;/strong&gt; holt sich eine Referenz auf den zu ersetzenden Bereich (unser Div mit der ID Content). &lt;strong&gt;Zeile 32&lt;/strong&gt; überschreibt diesen Inhalt schlussendlich mit der Antwort des Servers.&lt;/p&gt;  &lt;p&gt;Damit das ganze auch funktioniert muss die Funktion &lt;em&gt;sendAjaxRequest&lt;/em&gt; aus &lt;strong&gt;Zeile 20&lt;/strong&gt; noch aus unserem HTML Code heraus aufgerufen werden. Dazu erweitern wir unseren Link aus den &lt;strong&gt;Zeilen 5/6&lt;/strong&gt; einfach um das Attribut &lt;em&gt;onclick&lt;/em&gt;. &lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;sendAjaxRequest('static.html');&amp;quot;&amp;gt;&lt;/span&gt;Hier &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; klicken zum Request einer statischen Datei &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Ausgeführt sieht das ganze dann wie folgt aus:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil1_7DDD/1_erster_Start.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="117" alt="Erster Aufruf der Seite" src="/images/localhost/1_erster_Start_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil1_7DDD/2_aufruf_statisch.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="106" alt="Nach Aufruf des Links" src="/images/localhost/2_aufruf_statisch_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Ganz nett ...&lt;/h4&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;wir wissen nun also, wie wir statische Dateien nachladen können, aber steht das &lt;strong&gt;X&lt;/strong&gt; in AJA&lt;strong&gt;X&lt;/strong&gt; nicht für XML Webservices?&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Genau! Deshalb habe ich das Demoprojekt auch um einen kleinen Webservice mit zwei sinnlosen Methoden erweitert:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;AjaxDemoService&lt;/span&gt; : System.Web.Services.&lt;span style="color: #2b91af"&gt;WebService&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #2b91af"&gt;WebMethod&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; HelloWorld() {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #2b91af"&gt;WebMethod&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Echo(&lt;span style="color: blue"&gt;int&lt;/span&gt; number)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;&amp;quot;Sie haben {0} eingegeben.&amp;quot;&lt;/span&gt;, number);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Wie rufen wir einen solchen Service nun aber per JavaScript auf?&lt;/p&gt;  &lt;p&gt;Die Antwort findet sich relativ schnell, wenn man die URL des Webservices im Browser eingibt. In der nun erscheinenden Seite werden sämtliche Methoden des Webservices aufgelistet. Ein Klick auf eine dieser Methoden verrät schlussendlich, wie die Methode aufgerufen werden muss. Im Beispiel der Methode HelloWorld sieht die Ausgabe für eine HTTP Post Anfrage zum Beispiel wie folgt aus:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil1_7DDD/3_hello_world_http_post.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="128" alt="Beschreibung des POST Aufrufs der Webservice Methode" src="/images/localhost/3_hello_world_http_post_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Für die Methode Echo wird folgende Ausgabe produziert:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil1_7DDD/4_echo_http_post.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="156" alt="4_echo_http_post" src="/images/localhost/4_echo_http_post_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Im Vergleich zu unserer bisherigen Vorgehensweise beim dynamischen Nachladen der statischen Datei fällt auf, dass die Methode, über die die Anfrage gestartet wird, nun nicht mehr &lt;strong&gt;GET&lt;/strong&gt; ein kann, sondern &lt;strong&gt;POST&lt;/strong&gt; sein muss.&lt;/p&gt;  &lt;p&gt;Außerdem wird nun auch ein bestimmter Content-Type, nämlich &lt;em&gt;application/x-www-form-urlencoded&lt;/em&gt; benötigt. Speziell bei der Methode Echo fällt auf, dass außerdem nun auch Daten mit an den Server gesendet werden müssen.&lt;/p&gt;  &lt;p&gt;Um die veränderten Anforderungen abdecken zu können, erweitere ich das bestehende JavaScript um eine neue Funktion:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;function&lt;/span&gt; postAjaxRequest(url, data) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (xmlHttp) {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp.open(&lt;span style="color: #a31515"&gt;&amp;quot;POST&amp;quot;&lt;/span&gt;, url, &lt;span style="color: blue"&gt;true&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp.onreadystatechange = requestFinished;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp.setRequestHeader(&lt;span style="color: #a31515"&gt;'Content-type'&lt;/span&gt;, &lt;span style="color: #a31515"&gt;'application/x-www-form-urlencoded'&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; xmlHttp.send(data);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Die neuen Funktion, &lt;em&gt;postAjaxRequest&lt;/em&gt; ähnelt der vorherigen Funktion &lt;em&gt;sendAjaxRequest&lt;/em&gt;. Die veränderten Anforderungen ließen sich relativ einfach integrieren. In &lt;strong&gt;Zeile 3&lt;/strong&gt; wurde aus einem &lt;em&gt;GET&lt;/em&gt; ein &lt;em&gt;POST&lt;/em&gt;. In &lt;strong&gt;Zeile 5&lt;/strong&gt; wird der zusätzlich benötigte Content-Type gesetzt. In &lt;strong&gt;Zeile 6&lt;/strong&gt; wird der Methode &lt;em&gt;send&lt;/em&gt; nun nicht mehr fix &lt;em&gt;null&lt;/em&gt; als Datenparameter übergeben. Stattdessen wird das neue Argument &lt;em&gt;data&lt;/em&gt; weiter gereicht.&lt;/p&gt;  &lt;p&gt;Der HTML Code musste auch nur unwesentlich erweitert werden. Er erhält zwei neue Links zum Aufruf der beiden Webmethoden:&lt;/p&gt;  &lt;div style="border-right: 1px solid; border-top: 1px solid; font-size: 10pt; background: white; border-left: 1px solid; color: black; border-bottom: 1px solid; font-family: courier new"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;postAjaxRequest('AjaxDemoService.asmx/HelloWorld', null);&amp;quot;&amp;gt;&lt;/span&gt;Hier&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; für Hello World WebService klicken &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;br&lt;/span&gt; &lt;span style="color: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt; &lt;span style="color: red"&gt;href&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;#&amp;quot;&lt;/span&gt; &lt;span style="color: red"&gt;onclick&lt;/span&gt;&lt;span style="color: blue"&gt;=&amp;quot;postAjaxRequest('AjaxDemoService.asmx/Echo', 'number=1');&amp;quot;&amp;gt;&lt;/span&gt;Hier&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; für Echo WebService klicken &lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Das Ergebnis sieht anschließend wie folgt aus:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil1_7DDD/5_hello_world.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="115" alt="Abbildung zeigt den Rückgabewert des Hello World Webservices" src="/images/localhost/5_hello_world_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;a href="http://blog.codemurai.de/images/ASP.NETWebformsAnwendungenundAjaxTeil1_7DDD/6_echo.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="156" alt="Abbildung zeigt die Rückgabe des Echo Web Services" src="/images/localhost/6_echo_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h4&gt;Fazit&lt;/h4&gt;  &lt;p&gt;Ajax in eine Webanwendung zu integrieren ist aus technischer Sicht nicht sonderlich schwierig. Der vorliegende Blog Post hat gezeigt, dass sich selbst ohne &amp;quot;&lt;em&gt;magische&lt;/em&gt;&amp;quot; Frameworks mit wenigen Zeilen JavaScript Ajax Funktionalitäten integrieren lassen. Natürlich ist die gezeigte Implementierung nur sehr rudimentär. So wurde das zurückgegeben XML des Webservices zum Beispiel noch nicht geparsed und es fand außerdem so gut wie keine Fehlerbehandlung statt. Dieses in das Beispiel zu integrieren hätte den Rahmen eines Blogposts jedoch vollständig gesprengt. Außerdem gibt es genau aus diesen Gründen auch bereits fertige Frameworks, wie ASP.NET AJAX oder jQuery, die einem genau diese Detailarbeit abnehmen.&lt;/p&gt;  &lt;p&gt;Ehe man ein solches Framework einsetzt, sollte man jedoch die Grundlagen dessen kennen, was hinter den Kulissen geschieht. Und genau diese Grundlagen haben wir in diesem Blog Post geschaffen.&lt;/p&gt;  &lt;p&gt;Das vollständige Beispiel werde ich übrigens am Wochenende zum Download bereit stellen.&lt;/p&gt;&lt;img src="http://blog.codemurai.de/aggbug/146.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andre</dc:creator>
            <guid>http://blog.codemurai.de/archive/2010/01/29/asp-net-webforms-anwendungen-und-ajax-teil-1.aspx</guid>
            <pubDate>Fri, 29 Jan 2010 01:51:35 GMT</pubDate>
            <comments>http://blog.codemurai.de/archive/2010/01/29/asp-net-webforms-anwendungen-und-ajax-teil-1.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blog.codemurai.de/comments/commentRss/146.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>
