﻿<?xml version="1.0" encoding="utf-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel><title>René's Weblog und was die Welt noch nicht wissen wollte</title><link>http://weblog.drescher-hackel.de</link><description>Aktuelle .NET - Web-News</description><copyright>Copyright 2009 - René Drescher-Hackel</copyright><lastBuildDate>Fri, 30 Jul 2010 04:56:46 GMT</lastBuildDate><item><guid>http://weblog.drescher-hackel.de/gu.CD5CF6BC-3016-44E2-816C-3C2B6777115F.content.aspx</guid><title>HTTP Compression nutzen</title><description> &lt;div&gt; Wer den &lt;a href="http://www.fiddler2.com/fiddler2/" tabindex="0" accesskey="L" title="zur Seite: Fiddler2.com"&gt; Fiddler2&lt;/a&gt; in Benutzung hat und sich diverse Auswertungen ansieht, stolpert sicher so wie ich über die Anzeige der Kompression der Webseite. &lt;br /&gt; &lt;img alt="Kompression_1" src="/images/kompression/kompression1.png" style="width: 590px; height: 451px" /&gt;&lt;br /&gt; &lt;br /&gt; Also stellte sich die Frage, wie ich nun diese Kompression aktiviert bekomme. Auf den &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/d52ff289-94d3-4085-bc4e-24eb4f312e0e.mspx?mfr=true" tabindex="0" accesskey="L" title="zur Seite: microsoft.com"&gt;Internetseiten von Microsoft&lt;/a&gt; findet man diverse Hinweise, wie das ganze sich am IIS einstellen lässt. &lt;/div&gt; &lt;div&gt; Irgendwie habe ich es aber nie geschafft, auch nur annähernd das angezeigt zu bekommen, was in den Beschreibungen genannt wurde. &lt;br /&gt; &lt;br /&gt; Nun fand ich eine weitere &lt;a href="http://www.stardeveloper.com/articles/display.html?article=2007110401&amp;amp;page=1" tabindex="0" accesskey="L" title="zur Seite: stardeveloper.com"&gt;interessante Lösung&lt;/a&gt;. &lt;br /&gt; &lt;br /&gt; Hier wurde beschrieben, wie sich die Kompression über die Webanwendung realisieren lässt. Dazu wird in der Datei global.asax einfach die Methode &lt;a class="code"&gt;Application_PreRequestHandlerExecute(object sender, EventArgs e)&lt;/a&gt; implementiert. &lt;br /&gt; &lt;br /&gt; Was passiert dann in dieser Methode: zuerst wird über den Header ausgelesen, ob Kompression überhaupt unterstützt wird. Je nach dem, welche Unterstützung gegeben ist, wird der&amp;nbsp; aktuelle OutputStream entsprechend komprimiert und wieder an die Response.Filter - Eigenschaft übergeben.&lt;br /&gt; &lt;br /&gt; Den Code kann man auf der &lt;a href="http://www.stardeveloper.com/articles/display.html?article=2007110401&amp;amp;page=1" tabindex="0" accesskey="L" title="zur Seite: stardeveloper.com"&gt;o.g. Webseite&lt;/a&gt; nachlesen. &lt;br /&gt; &lt;br /&gt; Implementiert man das Ganze, wie beschrieben, bleibt der Erfolg nicht aus und &lt;a href="http://www.fiddler2.com/fiddler2/" tabindex="0" accesskey="L" title="zur Seite: Fiddler2.com"&gt; Fiddler2&lt;/a&gt; zeigt an, dass die Komprimierung der Webseite aktiv ist. &lt;br /&gt; &lt;br /&gt; &lt;img alt="Kompression_2" src="/images/kompression/kompression2.png" style="width: 584px; height: 482px" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Eine weitere Überprüfung mit &lt;a href="https://addons.mozilla.org/de/firefox/addon/1843/"&gt; Firebug&lt;/a&gt; bestätigt die Anzeige. &lt;br /&gt; &lt;br /&gt; &lt;img alt="Kompression_3" src="/images/kompression/kompression3.png" style="width: 604px; height: 143px" /&gt;&lt;br /&gt; &lt;br /&gt; Es ist doch am Ende immer wieder schön zu erleben, wie einfach die Dinge sich lösen lassen. &lt;/div&gt;</description><link>http://weblog.drescher-hackel.de/CD5CF6BC-3016-44E2-816C-3C2B6777115F/HTTP+Compression+nutzen.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Thu, 10 Jun 2010 07:47:34 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.0E0DBC1B-56D6-400E-95BB-C631BE5BDEDE.content.aspx</guid><title>Gedanken zum Test Driven Development (TDD)</title><description>&lt;p&gt; Am 25.03.2010 hat die Franken-.NET-Usergroup das Thema TDD auf der Tagesordnung gehabt. Grund genug, sich auf den Weg von Regensburg nach Erlangen zu machen. &lt;/p&gt; &lt;p&gt; Mein Fazit ist jedoch relativ n&amp;uuml;chtern ausgefallen. Doch der Reihe nach. TDD geh&amp;ouml;rt inzwischen zum guten Ton unter Softwareentwickler, genauso wie CCD und OOP/OOD. Doch bringt mich TDD wirklich weiter? Bin ich wirklich effektiver am Ende?&lt;/p&gt; &lt;p&gt; Hier habe ich nach dem Vortrag meine Bedenken. So war eine Aussage: „Ohne ReSharper geht’s gleich gar nicht“ Hallo? Habe ich was verpasst? Es kann ja wohl nicht allen Ernstens davon abh&amp;auml;ngen, dass ich ReSharper einsetzen muss, um gescheit zu entwickeln! Deutlich ist dann auch geworden, dass in der Tat ein Refactoring der implementierten Codezeile vom Vortragenden fast ausschlie&amp;szlig;lich auf „Anraten“ des ReSharper erfolgte. Irgendwie erinnert das Ganze mich an den immer noch andauernden Handy-Wahn. Fast kein Mensch ist heute noch ohne Handy unterwegs, man muss immer erreichbar sein, die wenigsten schaffen es, das Telefon auszuschalten. Mit dem Re-Sharper scheint ein &amp;auml;hnliches Ph&amp;auml;nomen bei den Softwareentwicklern angekommen zu sein. Um es gleich deutlich zu machen – ReSharper ist sicher ein sehr gutes Programm, dass seine Dienste tut – aber wenn ich dann nur noch offensichtlich in der Lage bin, Code gescheit aufzur&amp;auml;umen, wenn Fremdsoftware mich dabei unterst&amp;uuml;tzt, dann finde ich es schon etwas traurig, wohin die Entwicklung geht. Doch damit nicht genug – komme ich zur&amp;uuml;ck zum TDD und die Eingangs gestellt Frage: bin ich wirklich produktiver? Jan Welker erkl&amp;auml;rte gleich zu Beginn des Vortrages, dass ihnen bei der Vorbereitung aufgefallen ist, dass sie nach einer Stunde intensives „coden“ nicht einmal F5 gedr&amp;uuml;ckt haben – sicher fein, aber wie oft haben sie ihre Test gestartet?? Der Abend schaffte Klarheit – &amp;uuml;berspitzt formuliert: f&amp;uuml;r jede Zeile Code ein Teststart (analog F5). Im anschlie&amp;szlig;enden Gespr&amp;auml;ch r&amp;auml;umte Jan ein, dass man in der Tat wesentlich &amp;ouml;fter die Tests startet, als man es sonst mit dem beherzten Tastenanschlag der F5 Taste t&amp;auml;te. Na prima, bleibt das Denken nun auf der Strecke?&lt;/p&gt; &lt;p&gt; Ist es denn nicht so, dass ich mir vorher Gedanken mache, was ich f&amp;uuml;r mein Programm implementieren m&amp;ouml;chte? Tests helfen mir in der Regel, wenn ich mein Programm erweitere und durch meinen Testlauf sicher gestellt werden kann, dass bestehender Programmcode noch weiter funktioniert. Aber eigentlich ja auch wieder der falsche Ansatz, weil dann w&amp;uuml;rde ich im Code erweitern und nicht wie in der TDD vorgesehen, von der bestehenden Testmethode aus, also testgetrieben. Aber brauche ich einen selbst kreierten Kontrolleur meiner Arbeit? Sinnvoll ist das TDD doch erst dann, wenn die Testmethoden von einem Dritten erstellt werden und nicht vom Programmierer selbst. Wenn der Entwickler den Test formuliert, dann sehe ich auch hier die Gefahr, dass die Tests nur soweit formuliert werden, wie das Verst&amp;auml;ndnis des Programmierers f&amp;uuml;r die geforderten Funktionalit&amp;auml;ten am Ende sind. TDD soll mich dazu anhalten, nur das zu implementieren, was auch tats&amp;auml;chlich ben&amp;ouml;tigt wird – aber mal ganz ketzerisch gefragt: machen wir das nicht immer?? Jetzt steht auf der anderen Seite CCD mit seinem „Anspruch“, dass wir gut sortiert und aufger&amp;auml;umten Code schreiben, der auch noch nach Wochen lesbar und verst&amp;auml;ndlich ist. Das gleiche Ziel verfolgt aber TDD auch -&amp;gt; YAGNI. &lt;/p&gt; &lt;p&gt; Im Rahmen des Treffens kamen dann noch Fragen auf, ob man nicht auch „private“ Methoden Unit-Tests unterziehen kann. Das Ganze entwickelte sich dann pl&amp;ouml;tzlich in eine weitere &amp;uuml;berraschende Richtung, in dem Tom den Einwand erhob, doch bitte nur gegen Interfaces zu programmieren und nur das, was &amp;ouml;ffentlich bekannt sein soll, eben &amp;uuml;ber ein Interface bereit zu stellen. Oh je, dachte ich so bei mir. Also private Methoden muss ich nicht separaten Tests unterziehen, denn der Ansatz der TDD ist ja gerade, dass ich von einer Methode her implementiere, teste und dann aufr&amp;auml;ume. Im Zuge des Aufr&amp;auml;umens entstehen meine privaten Methoden. Da der Test vorher gelaufen ist, brauch ich also die neu entstandenen Methoden eben nicht mehr separaten Tests unterziehen.&lt;/p&gt; &lt;p&gt; Die Frage, die sich mir nun stellt ist, wie geht es weiter? Der derzeitige Status Quo ist f&amp;uuml;r mich etwas verwirrend. Was mir fehlte an diesem Abend ist die Testautomation mit Visual Studio. Ich verstehe nicht, warum ich nicht die Testm&amp;ouml;glichkeiten des Studios nehme. Gut, einzig das Argument, dass Tests im Studio erst mit der Professional-Version von Haus aus m&amp;ouml;glich sind, w&amp;uuml;rde die Vorgehensweise, wie sie am Abend besprochen wurde rechtfertigen.&lt;/p&gt; &lt;p&gt; Die meisten Probleme, die in der Entwicklung auftreten, betreffen in der Regel Fragen des Integrationstest. Ich pers&amp;ouml;nlich sehe nicht die Probleme in der Entwicklung, dass ich mich von TDD abh&amp;auml;ngig mache. Sicher ist die Vorgehensweise, vom Test zum Code zu entwickeln, von Vorteil – doch sehe ich darin kein Allheilmittel. Fragen des Integrationstest, Fragen des Tests von mit einander verbandelten Komponenten sind offen geblieben.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/0E0DBC1B-56D6-400E-95BB-C631BE5BDEDE/Gedanken+zum+Test+Driven+Development+(TDD).content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 27 Mar 2010 23:57:14 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.72889B57-5A9B-4124-9E00-9AD4D8C37D32.content.aspx</guid><title>Geht nicht - gibt's nicht</title><description>&lt;div style="overflow: hidden;"&gt; &lt;img src="/images/Cover_DM_44b8e61f1072c8.png" alt="dotnet-magazin 04/2010" style="margin: 0px 15px; float: left;" /&gt; &lt;p style="display: inline; width: 470px; float: left;"&gt; Im &lt;a href="http://it-republik.de/dotnet/dotnet-magazin-ausgaben/Silverlight-4.0-000384.html" title="zur Seite des dotnet-magazins" accesskey="L" tabindex="0"&gt;dotnet-magazin 4/2010&lt;/a&gt; habe ich mich mal mit dem Thema der Auswahl von Komponenten auseinander gesetzt. Das Magazin ist seit dem 03.03.2010 im Handel zu erhalten. &lt;/p&gt; &lt;p style="clear: both;"&gt; &lt;/p&gt; &lt;/div&gt;</description><link>http://weblog.drescher-hackel.de/72889B57-5A9B-4124-9E00-9AD4D8C37D32/Geht+nicht+-+gibt's+nicht.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 06 Mar 2010 14:27:35 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.F49B0C06-95B4-445B-84D5-6CC8602327C6.content.aspx</guid><title>Generische Session</title><description>&lt;p&gt; In Erg&amp;auml;nzung zum Blogbeitrag &lt;a tabindex="0" title="zum Beitrag: Session einmal anders verwalten" accesskey="L" href="http://weblog.drescher-hackel.de/8DD51D74-573E-4D03-AAB9-B83578DD94D3/Session+einmal+anders+verwalten.content.aspx"&gt; Session einmal anders verwalten&lt;/a&gt; k&amp;ouml;nnte man doch das ganze um eine generische Methode erweitern, so dass man nicht mehr das anschlie&amp;szlig;ende Casten des Sessionr&amp;uuml;ckgabewertes vornehmen muss. Im Folgenden zeige ich kurz, welche &amp;Auml;nderungen hierzu erforderlich w&amp;auml;ren.&lt;br /&gt; &lt;/p&gt; &lt;p&gt; &lt;br /&gt; Die statische Klasse &lt;code class="code"&gt;AppSession&lt;/code&gt; wird um eine generische Methode &lt;code class="code"&gt;Get&amp;lt;T&amp;gt;&lt;/code&gt; erweitert.&lt;br /&gt; &lt;br /&gt; &lt;img alt="Bild1" src="../images/genericSession/Bild1.png" style="width: 383px; height: 135px" /&gt;&lt;br /&gt; &lt;br /&gt; Da das Session-Objekt und der Enum &lt;code class="code"&gt;SessionKey&lt;/code&gt; jeweils um die &lt;code class="code"&gt;Get&lt;/code&gt;-Methode erweitert wurden, muss auch der generische Ansatz hier implementiert werden, wobei dann wie gehabt die generische &lt;code class="code"&gt; Get&amp;lt;T&amp;gt;&lt;/code&gt;-Methode der &lt;code class="code"&gt;AppSession&lt;/code&gt;-Klasse aufgerufen wird.&lt;br /&gt; &lt;br /&gt; &lt;img alt="Bild2" src="../images/genericSession/Bild2.png" style="width: 618px; height: 65px" /&gt;&lt;br /&gt; &lt;br /&gt; und&lt;br /&gt; &lt;br /&gt; &lt;img alt="Bild3" src="../images/genericSession/Bild3.png" style="width: 373px; height: 45px" /&gt;&lt;br /&gt; &lt;br /&gt; Eine Frage, die schnell beim debuggen autauchen kann, warum denn nun eigentlich casten, wenn im Watch-Fenster &amp;uuml;ber GetType immer der richtige Type angegeben wird. Man m&amp;ouml;chte doch meinen, dass doch alles korrekt ist.&lt;br /&gt; &lt;br /&gt; &lt;img alt="Bild4" src="../images/genericSession/Bild4.png" style="width: 791px; height: 632px" /&gt;&lt;br /&gt; &lt;br /&gt; Doch Vorsicht ist geboten - die Erkenntnis ist dann gewiss, m&amp;ouml;chte man mit dem Objekt arbeiten:&lt;br /&gt; &lt;br /&gt; Mit der generischen Implementierung kann ich sofort auf dem Objekt arbeiten und Werte modifizieren,&lt;br /&gt; &lt;br /&gt; &lt;img alt="Bild6" src="../images/genericSession/Bild6.png" style="width: 938px; height: 280px" /&gt;&lt;br /&gt; &lt;br /&gt; was ich in der klassischen Variante nicht kann.&lt;br /&gt; &lt;br /&gt; &lt;img alt="Bild5" src="../images/genericSession/Bild5.png" style="width: 766px; height: 106px" /&gt;&lt;br /&gt; &lt;br /&gt; Berechtigter kritischer Einwand - auf &lt;code class="code"&gt;null&lt;/code&gt; muss so oder so gepr&amp;uuml;ft werden.&lt;br /&gt; Statt auf dem Sessionobjekt, k&amp;ouml;nnte man die gleiche Implementierung auch auf dem Applicationobjekt umsetzen.&lt;br /&gt; &lt;br /&gt; &lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/F49B0C06-95B4-445B-84D5-6CC8602327C6/Generische+Session.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 23 Jan 2010 20:40:15 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.38D42556-AFF4-482B-AF53-8F6CD2D47ABE.content.aspx</guid><title>Update ohne Panel mit AJAX.PRO</title><description> &lt;p&gt; K&amp;uuml;rzlich stolperte ich &amp;uuml;ber einen &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://aspnetzone.de/blogs/robertobez/archive/2009/08/31/komplexe-objekte-per-json-serialisierung-von-jquery-zu-aspnet-webservice.aspx#213009'" href="http://aspnetzone.de/blogs/robertobez/archive/2009/08/31/komplexe-objekte-per-json-serialisierung-von-jquery-zu-aspnet-webservice.aspx#213009"&gt; Beitrag von Roberto Bez&lt;/a&gt;, als ich dabei war, einen Blogbeitrag zum Thema Updatepanel &amp;amp; Co zu planen. Es entspricht dabei einer alten Angewohnheit, dass ich zuerst einmal&amp;nbsp; schaue, ob nicht &amp;uuml;ber dieses Thema schon genug geschrieben wurde, oder ob m&amp;ouml;glicherweise ein Bedarf da ist. Gut, ich muss eingestehen, zum Thema welches sich mit Ajax.Pro realisieren l&amp;auml;sst gibt es im Netz in der Tat nicht viel - im Wesentlichen ja nur &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://www.ajaxpro.info/' " href="http://www.ajaxpro.info/"&gt;Michaels Seite&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; Aber zur&amp;uuml;ckkommend auf das eigentliche Thema - dem Updatepanel - da ist immer genug Z&amp;uuml;ndstoff vorhanden. Und so haben sich schon &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://www.aspnetzone.de/blogs/robertobez/archive/2009/09/02/jquery-plugin-dynamisches-laden-von-asp-net-controls.aspx' " href="http://www.aspnetzone.de/blogs/robertobez/archive/2009/09/02/jquery-plugin-dynamisches-laden-von-asp-net-controls.aspx"&gt; Roberto&lt;/a&gt;&amp;nbsp; und &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://www.zerbit.de/artikel/usercontrol_dynamisch_laden_update_und_jquery_plugin.aspx' " href="http://www.zerbit.de/artikel/usercontrol_dynamisch_laden_update_und_jquery_plugin.aspx"&gt; Kristof Zerbe&lt;/a&gt; mit dem Thema im Rahmen einer jQuery-Plugin-Entwicklung recht eindrucksvoll befasst. Ich m&amp;ouml;chte mich heute einer weiteren Variation zu dem Thema zuwenden, nat&amp;uuml;rlich unter Verwendung von Ajax.Pro und etwas Javascript.&lt;/p&gt; &lt;p&gt; Hinsichtlich der grunds&amp;auml;tzlichen Fragen zu Ajax.Pro sei zun&amp;auml;chst auf die Seite von &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://www.ajaxpro.info' " href="http://www.ajaxpro.info"&gt;Michael Schwarz&lt;/a&gt; verwiesen als auch &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://weblog.drescher-hackel.de/8FE24D67-434B-4231-B446-06CD8AD1276E/Datengebundene+Webanwendungen+mit+AJAX.PRO.content.aspx' " href="http://weblog.drescher-hackel.de/8FE24D67-434B-4231-B446-06CD8AD1276E/Datengebundene+Webanwendungen+mit+AJAX.PRO.content.aspx"&gt; den Blogbeitrag&lt;/a&gt;, welchen ich hierzu schon einmal verfasst habe. Prinzipiell muss an dieser Stelle gesagt werden, Ajax.Pro ist nicht mehr kompliziert, als die Umsetzung des Ganzen &amp;uuml;ber jQuery und Webservices. Ich halte hier Ajax.Pro sogar noch f&amp;uuml;r wesentlich einfacher, da ich als Entwickler mich auf das Wesentliche konzentrieren kann und der Implementierungsaufwand meiner Meinung nach sogar noch geringer ausf&amp;auml;llt. Zudem bietet mir Ajax.Pro die M&amp;ouml;glichkeit, .NET-Objekte an den Client zusenden - doch dazu weiter unten mehr.&lt;/p&gt; &lt;p&gt; Zur&amp;uuml;ck zum Updatepanel: seit je her waren in der Webentwicklung Bestrebungen da, m&amp;ouml;glichst nur Teilbereiche der Seite zu aktualisieren und nicht immer die ganze Seite neu zu laden. Die Anf&amp;auml;nge waren wohl die Frames. Dann kamen die IFrames, dann das Remotescripting und ActiveX und nun sind wir beim XmlHttpRequest. &lt;/p&gt; &lt;p&gt; &amp;nbsp;F&amp;uuml;r den Benutzer der Webseite als auch den Entwickler ist das Manko des Updatepanels aber offensichtlich - es wird jedes Mal der komplette Page-Lifecycle durchlaufen - ganz dem Motto: &amp;quot;Kauf eine Kuh, wenn du ein Glas Milch brauchst&amp;quot;. Aber das war es doch eigentlich, was mit AJAX alles besser werden sollte? Nun gut.&lt;/p&gt; &lt;p&gt; Was passiert in der Regel, wenn man sich f&amp;uuml;r das Updatepanel entscheidet: in der Regel l&amp;auml;dt der Entwickler ein Usercontrol wodurch die Seite im Informationsgehalt sich &amp;auml;ndert. Das Usercontrol ist dabei meistens ein HTML-Ausschnitt, also nie eine HTML-Seite im eigentlichen Sinne. Was der Entwickler dann in der Regel ebenfalls macht - er l&amp;auml;dt die Daten, die f&amp;uuml;r den Benutzer von Bedeutung sind gleich mit. Und da haben wir schon das eigentliche Problem. Letztlich ist doch genau diese Vorgehensweise schlichtweg bl&amp;ouml;d. Denn was habe ich immer: ich habe immer eine unbekannte Menge an Benutzern denen ich aber allen zum Beispiel immer das gleiche Formular pr&amp;auml;sentiere. Ist es denn nicht sinnvoller schon an dieser Stelle Daten und Anzeige zu trennen? Roberto und Kristof haben es ebenfalls in ihren Beitr&amp;auml;gen klar herausgestellt: &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://www.json.org' " href="http://www.json.org"&gt;JSON&lt;/a&gt; ist das, worauf man sich hier konzentrieren sollte. Wenn ich die Daten, welche regelm&amp;auml;&amp;szlig;ig einen benutzerspezifischen Hintergrund haben, von der Anzeige l&amp;ouml;se, dann kann ich die Anzeige viel besser cachen. Dem k&amp;ouml;nnte man jetzt kritisch entgegnen, dass man zus&amp;auml;tzliche Serveranfragen hat oder, wenn man die Daten holt, kann man das Layout doch auch gleich mitnehmen. Nun, ja, man kann. Aber ich m&amp;ouml;chte hier letztlich demonstrieren, dass man es auch anders l&amp;ouml;sen kann. Den Vorteil, welchen ich in dieser L&amp;ouml;sung sehe ist schlichtweg, dass ich mich auf das Wesentliche konzentriere - dem Datenaustausch. Damit schaffe ich langfristig eine deutliche Verringerung des Datentransfers in der Client-Server-Kommunikation.&lt;/p&gt; &lt;p&gt; Bei meiner Planung von Webanwendungen mit Ajax-Funktionalit&amp;auml;t setze ich auf Ajax.Pro. Wie oben schon gesagt, ist es in meinen Augen wesentlich &amp;uuml;bersichtlicher und der Implementierungsaufwand ist auch deutlich geringer. Dies m&amp;ouml;chte ich kurz an Hand einer kleinen Gegen&amp;uuml;berstellung verdeutlichen:&lt;/p&gt; &lt;p&gt; Roberto und Kristof haben sich f&amp;uuml;r jQuery und folgenden Aufbau entschieden:&lt;/p&gt; &lt;p&gt; &lt;img alt="Loesung_Roberto" src="/images/updateohnepanel/bild4.png" style="width: 554px; height: 368px" /&gt;&lt;/p&gt; &lt;p&gt; &amp;Uuml;ber einen Defaultparameter wird ein Standardusercontrol benannt und im Weiteren werden die f&amp;uuml;r die jQuery-Implementierung eines Ajax-Aufrufes erforderlichen Parameter und Einstellungen gesetzt.&lt;/p&gt; &lt;p&gt; Mit Ajax.Pro w&amp;uuml;rde ich die Umsetzung zum Beispiel so umsetzen:&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild5" src="/images/updateohnepanel/bild5.png" style="width: 464px; height: 180px" /&gt;&lt;/p&gt; &lt;p&gt; Worin unterscheiden sich die beiden Ans&amp;auml;tze? Bei Ajax.Pro muss ich mich nicht mehr um den &lt;i&gt;dataType&lt;/i&gt; und den &lt;i&gt;contentType&lt;/i&gt; k&amp;uuml;mmern. Dies wird von Ajax.Pro automatisch gesetzt, entsprechend dem zur&amp;uuml;ckgegebenen Types. W&amp;uuml;rde ich mich hier bei der jQuery-L&amp;ouml;sung verschreiben, h&amp;auml;tte ich ein Problem. Weiter muss ich nicht die Architektur offen legen. Mit Ajax.Pro k&amp;ouml;nnte ich sogar die Methodennamen per Attribute nach au&amp;szlig;en verschleiern. Da meine Templates allesamt namentlich bekannt sind, habe ich hier einen Enum angelegt, den ich beim Aufruf der Servermethode einfach mitgebe. Den Rest, wo zum Beispiel das Usercontrol am Server liegt, das alles kann ich &amp;uuml;ber den Enum serverseitig aufl&amp;ouml;sen. Und zu guter Letzt - ich habe deutlich weniger Schreibaufwand. &lt;/p&gt; &lt;p&gt; Hinsichtlich des Ladens des Usercontrols, so dass es gerendert werden kann, hat Kristof aus meiner Sicht die bessere L&amp;ouml;sung gew&amp;auml;hlt. Generell ist es immer das gleiche Vorgehen: Eine Instanz der Page-Klasse wird erzeugt. &amp;Uuml;ber die statische Methode LoadControl der Page-Klasse wird das Usercontrol geladen und dem zuvor erzeugten Instanzobjekt hinzugef&amp;uuml;gt. &amp;Uuml;ber die Excecute-Methode des Server-Objekts des aktuellen HttpContexts wird die Pageinstanz in ein Stringwriter-Objekt &amp;uuml;bertragen und das Stringwriter-Objekt &amp;uuml;ber die Methode ToString an den Aufrufer zur&amp;uuml;ckgegeben.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild6" src="/images/updateohnepanel/bild6.png" style="width: 465px; height: 150px" /&gt;&lt;/p&gt; &lt;p&gt; W&amp;uuml;rde man dies so belassen, h&amp;auml;tte man das Problem, dass das Usercontrol keine ASP-Server-Steuerelemente beinhalten d&amp;uuml;rfte. Man w&amp;auml;re auf Standard-HTML-Elemente beschr&amp;auml;nkt und k&amp;ouml;nnte so zum Beispiel auch keine Customcontrols im Usercontrol unterbringen. &lt;/p&gt; &lt;p&gt; &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://www.zerbit.de/default.aspx' " href="http://www.zerbit.de/default.aspx"&gt;Kristof&lt;/a&gt; hat diesen Punkt in &lt;a tabindex="0" accesskey="L" title="zur Seite: ' ' " href="http://www.zerbit.de/artikel/usercontrol_dynamisch_laden_update_und_jquery_plugin.aspx"&gt; seiner Variation des jQuery-Plugins des ascxLoader&lt;/a&gt; mit ber&amp;uuml;cksichtigt und f&amp;uuml;gte dem Page-Instanzobjekt noch eine Form-Instanz hinzu. Bevor er Stringwriter an den Aufrufer zur&amp;uuml;ckgibt, bereinigt er diesen, in dem er den Form-Tag und den Viewstate unter Verwendung eines regul&amp;auml;ren Ausdrucks aus der Zeichenkette entfernt.&lt;/p&gt; &lt;p&gt; Die o.g. Methode w&amp;uuml;rde abschlie&amp;szlig;end daher so ausschauen:&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild7" src="/images/updateohnepanel/bild7.png" style="width: 459px; height: 188px" /&gt;&lt;/p&gt; &lt;p&gt; Anders als Kristof l&amp;ouml;se ich das Entfernen des Viewstate und des Form-Tags auf der Clientseite. Man k&amp;ouml;nnte es aber genauso gut auf der Serverseite l&amp;ouml;sen, so wie es Kristof &amp;uuml;ber regul&amp;auml;re Ausdr&amp;uuml;cke gemacht hat, was dann den Vorteil h&amp;auml;tte, dass man weniger Daten am Ende &amp;uuml;ber die Leitung schickt. Meine clientseitige L&amp;ouml;sung sieht indes so aus:&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild8" src="/images/updateohnepanel/bild8.png" style="width: 524px; height: 203px" /&gt;&lt;/p&gt; &lt;p&gt; Ich erzeuge als erstes ein jQuery-Objekt. Anschlie&amp;szlig;end suche ich den DIV-Tag, der ein input-Element enth&amp;auml;lt, dessen ID-Attribute den Wert VIEWSTATE beinhaltet. Zum Schluss &amp;uuml;bernehme ich dann aber nur den innerHTML-Teil des Form-Tags.&lt;/p&gt; &lt;p&gt; Soweit so gut. Eingangs hatte ich angesprochen, dass es doch von Vorteil w&amp;auml;re, man w&amp;uuml;rde beim Usercontrol eine weitere &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://de.wiktionary.org/wiki/Abstraktion' " href="http://de.wiktionary.org/wiki/Abstraktion"&gt;Abstraktion&lt;/a&gt; vornehmen, indem man das reine Layout von den benutzerspezifischen Daten noch einmal trennt. Das hat dann den Vorteil, dass ich einmal vom Server abgerufenes Layout sowohl am Server als auch am Client zwischenspeichern kann. Das Beispielprojekt, welches ich zu diesem Beitrag angelegt habe, beinhaltet einen Container, der &amp;uuml;ber einzelne Tabreiter gesteuert wird. F&amp;uuml;r jeden Tabreiter wird ein individuelles Layout vom Server abgerufen. Wechsle ich nun zwischen den Tabreitern in v&amp;ouml;lliger Aufregung hin un her (diese Leute gibt es wirklich, die sowas machen - ich hab sie kennen gelernt), dann muss ich nicht dauernd den Server bem&amp;uuml;hen, sondern kann auf die im Javascript gecachten Daten zur&amp;uuml;ckgreifen. Der Performancegewinn ist dabei enorm. &lt;/p&gt; &lt;p&gt; M&amp;ouml;chte ich nun die Formularelemente mit Daten f&amp;uuml;llen, so sende ich nur noch ein Minimum an Daten zwischen Client und Server hin und her. Gerade bei recht komplexen Formularen erscheint mir dieses Vorgehen recht sinnvoll.&lt;/p&gt; &lt;p&gt; Auch auf der Serverseite kann man einmal erledigte Arbeit so abspeichern, dass alle Benutzer einen Vorteil davon haben. So habe ich mich entschlossen, jedes erstmals gerendertes Usercontrol in einer Applicationvariable abzulegen.&lt;/p&gt; &lt;p&gt; Betrachte ich jetzt den Punkt des Datentransfers, so sollte man sich zu jedem Usercontrol eine Objektstruktur &amp;uuml;berlegen, &amp;uuml;ber die man zwischen Client und Server die Daten austauschen kann. &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://aspnetzone.de/blogs/robertobez/archive/2009/08/31/komplexe-objekte-per-json-serialisierung-von-jquery-zu-aspnet-webservice.aspx' " href="http://aspnetzone.de/blogs/robertobez/archive/2009/08/31/komplexe-objekte-per-json-serialisierung-von-jquery-zu-aspnet-webservice.aspx"&gt; Roberto hat in seinem Beitrag&lt;/a&gt; die M&amp;ouml;glichkeit des Austauschs komplexer Objekte angesprochen und eine L&amp;ouml;sungsm&amp;ouml;glichkeiten aufgezeigt. Ajax.Pro bringt diese M&amp;ouml;glichkeit gewisserma&amp;szlig;en von Haus aus mit - ein Umstand, den ich von Beginn an sehr gesch&amp;auml;tzt habe und auch heute nicht mehr missen m&amp;ouml;chte. In diesem Zusammenhang m&amp;ouml;chte ich auf das Beispielsprojekt zu meinem &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://weblog.drescher-hackel.de/8FE24D67-434B-4231-B446-06CD8AD1276E/Datengebundene+Webanwendungen+mit+AJAX.PRO.content.aspx' " href="http://weblog.drescher-hackel.de/8FE24D67-434B-4231-B446-06CD8AD1276E/Datengebundene+Webanwendungen+mit+AJAX.PRO.content.aspx"&gt; o.g. Blogbeitrag&lt;/a&gt; nur verweisen.&lt;/p&gt; &lt;p&gt; Im heutigen Beispiel &amp;uuml;bertrage ich zwischen Client und Server lediglich einen String. Das Ganze ist soweit ohnehin noch recht ausbauf&amp;auml;hig. Im wesentlichen m&amp;ouml;chte ich ja nur die prinzipielle M&amp;ouml;glichkeiten aufzeigen.&lt;/p&gt; &lt;p&gt; Als Datenquelle habe ich wieder eine kleine XML-Datei genommen, welche einen Ausschnitt aus der Customer-Tabelle der Northwind-Datenbank wieder gibt. Als Contenttemplates habe ich zwei Usercontrols angelegt, welche ich zus&amp;auml;tzlich &amp;uuml;ber einen Enum verwalte.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild12" src="/images/updateohnepanel/bild12.png" style="width: 318px; height: 110px" /&gt;&lt;/p&gt; &lt;p&gt; Das Rendern der Usercontrols speicher ich mir in einer Applicationvariable ab, so dass diese Arbeit nur einmal getan werden muss. Auch hier ist wieder Spielraum, wie man die Verwaltung der Templates, wenn sie gerendert sind, aufbauen m&amp;ouml;chte.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild13" src="/images/updateohnepanel/bild13.png" style="width: 823px; height: 223px" /&gt;&lt;/p&gt; &lt;p&gt; Clientseitig werden die Template nur vom Server geholt, wenn sie noch nicht im Array, welches ich als Clientcache benutze, vorhanden sind. Im Ergebnis muss ich mich nur noch um die Daten k&amp;uuml;mmern. Hierzu habe ich mir eine kleine Methode geschrieben. Der Kniff besteht am Ende darin, dass die Formularfelder die gleichen Namen haben, wie die Objekteigenschaften des Datenobjektes.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild14" src="/images/updateohnepanel/bild14.png" style="width: 842px; height: 444px" /&gt;&lt;/p&gt; &lt;p&gt; Der Klick auf den Link in der Listenansicht wird &amp;uuml;ber den eventgebundenen Container aufgel&amp;ouml;st. Einen sehr ausf&amp;uuml;hrlichen &lt;a tabindex="0" accesskey="L" title="zur Seite: 'http://michael-schwarz.blogspot.com/2009/01/jquery-tipp-1-bind-verbessern.html' " href="http://michael-schwarz.blogspot.com/2009/01/jquery-tipp-1-bind-verbessern.html"&gt; Blogbeitrag zu dem Thema der Eventsteuerung&lt;/a&gt; hat Michael Schwarz verfasst. F&amp;uuml;r den Fall, dass das Template f&amp;uuml;r die Listenansicht geladen ist, wird der Datensatzkey zwischengespeichert und anschlie&amp;szlig;end programmatisch der Tab f&amp;uuml;r die Detailansicht aufgerufen.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild15" src="/images/updateohnepanel/bild15.png" style="width: 526px; height: 82px" /&gt;&lt;/p&gt; &lt;p&gt; Jetzt beginnt das Prozedere wieder von vorn - das Template wird geladen (vom Server oder aus dem Clientcache) und zu guter Letzt die Daten entsprechend dem zwischengespeicherten Datensatzkey vom Server abgeholt. Die Daten selbst k&amp;ouml;nnte man nun auch am&amp;nbsp; Client zwischenspeichern, doch m&amp;uuml;sste man hier unbedingt noch ein Zeitfenster ber&amp;uuml;cksichtigen, wann die G&amp;uuml;ltigkeit der gecachten Daten verf&amp;auml;llt. Beim reinen Formular hat man indes diese Sorgen nicht, da es hier in der Regel an den Daten fehlt.&lt;/p&gt; &lt;p&gt; Das zum Download bereitgestellt Projekt ist ein Visual Studio 2008 Projekt.&lt;/p&gt; &lt;p&gt; &amp;nbsp;&lt;/p&gt; &lt;div id="updatePanelDemo"&gt; &lt;div&gt; &lt;hr /&gt; &lt;p&gt; Live-Demo: (einen Tab anklicken)&lt;/p&gt; &lt;div id="tabs"&gt; &lt;ul&gt; &lt;li id="tab1"&gt; &lt;input type="hidden" value="0" /&gt; Detail&lt;/li&gt; &lt;li id="tab2"&gt; &lt;input type="hidden" value="1" /&gt;Liste&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;div id="tabsContent"&gt; &lt;div id="ServerResult"&gt; &lt;/div&gt; &lt;div id="updateProgress"&gt; &lt;img src="/images/ajax-loader.gif" width="15" height="15" alt="AjaxAnimation" /&gt;&lt;span&gt;Lade Daten...&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;hr /&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt; Zusammenfassend l&amp;auml;sst sich also sagen, dass sowohl &amp;uuml;ber die von Roberto und Kristof aufgezeigten Wege Usercontrols bequem &amp;uuml;ber ein Ajax-Request nachgeladen werden k&amp;ouml;nnen, als auch &amp;uuml;ber Ajax.Pro sich das Ganze umsetzen l&amp;auml;sst.&amp;nbsp; &lt;/p&gt; &lt;p&gt; Ein weiterer Punkt, der ebenfalls vorher gekl&amp;auml;rt sein sollte - will man denn in der Form Usercontrols nachladen - ist die Anwendungsstruktur. Es will sehr gut &amp;uuml;berlegt sein, wie die ganze Webanwendung aufgebaut sein soll und wie sie arbeiten soll. &lt;/p&gt; &lt;p&gt; Viel Spa&amp;szlig; beim Ausprobieren&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/38D42556-AFF4-482B-AF53-8F6CD2D47ABE/Update+ohne+Panel+mit+AJAX.PRO.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 22 Nov 2009 21:30:27 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.022222AC-B463-4C19-8F4E-2A9167FFC9B7.content.aspx</guid><title>Tücken im asynchronen Datei-Download</title><description> &lt;p&gt;Gelegentlich kommt es vor, dass man &amp;uuml;ber seine Webanwendung, Dateien zum Download bereitstellen m&amp;ouml;chte. Knifflig wird&amp;#39;s allerdings dann, wenn AJAX mit im Spiel ist. In diesem Beitrag m&amp;ouml;chte ich kurz aufzeigen, &amp;uuml;ber welches Problem man dabei stolpern kann.&lt;/p&gt; &lt;p&gt;AJAX-Anwendungen sind bekannt daf&amp;uuml;r, dass man bestimmte Prozesse zwischen Client und Server ablaufen l&amp;auml;sst und dies in der Regel so gestaltet, dass der Client nicht unn&amp;ouml;tig in seiner Arbeit blockiert wird. Das Ganze ist als asynchroner Prozess bekannt.&lt;/p&gt; &lt;p&gt;Eine Datei zum Download anzubieten ist von der Sache her auch kein gro&amp;szlig;es Problem: in der Regel wird hierzu ein Http-Handler bem&amp;uuml;ht, der den Filestream an den Ausgabestream des Response-Objektes &amp;uuml;bergibt. &amp;Uuml;ber die AddHeader-Methode kann man angeben, dass die Datei zum Download bereitgestellt werden soll.&lt;/p&gt; &lt;p&gt;Soweit also alles kein Problem. Interessant wird es dann, wenn dem eigentlichen Download eine Anfrage zum Server vorausgeschaltet ist, um zum Beispiel zu erfassen, wie oft die Datei heruntergeladen wurde, der eigentlich Download der Datei aber im Callbackhandler initiiert wird. In diesen F&amp;auml;llen passiert im Internet Explorer folgendes:&lt;/p&gt; &lt;p&gt; &lt;img alt="hinweis" src="/images/hinweis.png" style="width: 737px; height: 35px" /&gt;&lt;/p&gt; &lt;p&gt;Dies ist dann doppelt &amp;auml;rgerlich, wenn die Webanwendung ihren Inhalt asynchron nach l&amp;auml;dt. Best&amp;auml;tigt man nun die Warnmeldung des Internet Explorers, dann ist der urspr&amp;uuml;ngliche Content verworfen, da ein vollst&amp;auml;ndiger Reload der Seite erfolgt. Wie kann man das Problem nun umgehen? Ganz klar - man liest sich die Informationen der Informationsleiste genau durch, wo es n&amp;auml;mlich hei&amp;szlig;t:&lt;/p&gt; &lt;p style="font-style:italic;"&gt;&amp;nbsp;&lt;img alt="hilfe" src="/images/hilfe.png" style="width: 382px; height: 604px" /&gt;&lt;/p&gt; &lt;p&gt;Im Ergebnis bedeutet dies, im Fall der dem Download vorausgehenden Serverkommunikation muss diese synchron erfolgen, damit der Kontext der Verarbeitung nicht unterbrochen wird. &lt;/p&gt; &lt;p&gt;Beispiel: (Download einer einfache Textdatei - sampleDownload.txt)&lt;/p&gt; &lt;p&gt;&lt;a href="/sample/sampleDownload.txt/download.ashx" accesskey="D" tabindex="0" title="Synchroner Dateidownload" onclick="javascript: alert('synchroner Filedownload');location.href = '/sample/sampleDownload.txt/download.ashx'; return false;"&gt;synchron&lt;/a&gt; | &lt;a href="/sample/sampleDownload.txt/download.ashx" onclick="javascript:setTimeout(function(){alert('asynchroner Filedownload');location.href = '/sample/sampleDownload.txt/download.ashx';}, 1); return false;" accesskey="D" tabindex="0" title="Asynchroner Dateidownload"&gt;asynchron&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Die gleiche Problematik tritt auf, wenn innerhalb einer setTimeout-Anweisung ein Dateidownload angeboten wird. Ebenso ist klar, dass diese Problematik nur zutrifft, wenn der Download der Datei &amp;uuml;ber Javascript veranlasst wird.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/022222AC-B463-4C19-8F4E-2A9167FFC9B7/T%c3%bccken+im+asynchronen+Datei-Download.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Tue, 17 Nov 2009 10:40:25 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.384B1D89-9806-464B-B784-05832A27189C.content.aspx</guid><title>SEO - Suchmaschinenoptimierung</title><description>&lt;p&gt; SEO - eine Abk&amp;uuml;rzung nur oder ein Konzept, welches man ernst nehmen sollte? Hinter SEO verbirgt sich letztlich nichts anderes als die englische Bezeichnung &lt;span style="font-style: italic; font-size: 1em;"&gt;Search Engine Optimization&lt;/span&gt;, die im Deutschen f&amp;uuml;r Suchmaschinenoptimierung steht. Es stellt sich jedoch die Frage, wie optimiere ich meine Webseite f&amp;uuml;r die g&amp;auml;ngigen Suchmaschinen. Auf diese Fragen m&amp;ouml;chte ich im folgenden einmal etwas n&amp;auml;her eingehen.&lt;/p&gt; &lt;p&gt; Es ist wohl relativ unbestritten, dass &lt;a href="http://www.google.de" tabindex="0" accesskey="L" title="zur Seite: 'http://www.google.de'"&gt;Google&lt;/a&gt; als Suchmaschine eine wichtige Rolle in unserem Internet-Leben spielt. Es vergeht nahezu kein Tag, wo im Radio oder im Fernsehen nicht eine Meldung zum Thema Internetrecherche zu vernehmen ist. Auch haben die Zeitungen erkannt, dass es nicht ohne (Medium Internet) geht. Darum ist es wichtig, gut und schnell gefunden zu werden, damit die angebotene Information nicht in der Flut an im Internet abrufbaren Informationen untergeht.&lt;/p&gt; &lt;p&gt; Andere Suchmaschinenanbieter wie &lt;a href="http://de.yahoo.com/" tabindex="0" accesskey="L" title="zur Seite: 'http://de.yahoo.com/'"&gt;Yahoo&lt;/a&gt; oder &lt;a href="http://www.bing.com/?cc=de" tabindex="0" accesskey="L" title="zur Seite: 'http://www.bing.com/?cc=de'"&gt;Bing&lt;/a&gt; bieten &amp;auml;hnliche Programme an, doch m&amp;ouml;chte ich mich in diesem Beitrag auf die Webmaster-Tools von Google beschr&amp;auml;nken. Wie gesagt - sie kochen letztlich alle nur mit Wasser, die grunds&amp;auml;tzlichen Informationen f&amp;uuml;r eine gute Suchmaschinenoptimierung sind aber am Ende f&amp;uuml;r alle nahezu gleich.&lt;/p&gt; &lt;p&gt; &amp;nbsp;&amp;quot;Wie unterst&amp;uuml;tzt mich eine Suchmaschine?&amp;quot; Diese Frage sollte man sich als erstes stellen, selbst wenn die Seite sich noch im Aufbau befindet. Wer sich bei Google registriert, kann hier die Webmaster-Tools nutzen.&lt;/p&gt; &lt;p&gt; &lt;img alt="Webmastertools" title="Google-Produkt&amp;uuml;bersicht" src="/images/webmastertools.png" style="width: 688px; height: 248px" /&gt;&lt;/p&gt; &lt;p&gt; Wie die Webmaster-Tools funktionieren, hat Google separat in einer &lt;a href="http://www.google.com/support/webmasters/bin/topic.py?topic=8464" tabindex="0" accesskey="L" title="zur Seite: 'http://www.google.com/support/webmasters/bin/topic.py?topic=8464'"&gt; Anleitung zusammen gefasst&lt;/a&gt;. Was allerdings noch zu beachten ist, findet man bei Google in einer &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=35769" tabindex="0" accesskey="L" title="zur Seite: 'http://www.google.com/support/webmasters/bin/answer.py?answer=35769'"&gt; weiteren Hilfestellung&lt;/a&gt; oder man beherzigt schlichtweg die Hinweise, die man bei &lt;a href="http://de.wikipedia.org/wiki/Suchmaschinenoptimierung" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/Suchmaschinenoptimierung'"&gt; Wikipedia&lt;/a&gt; findet.&lt;/p&gt; &lt;p&gt; So n&amp;uuml;tzt es recht wenig und kann schlimmstenfalls zur Sperrung der Seite im Suchmaschinenindex f&amp;uuml;hren, schaltet man vor der eigentlichen Seite eine weitere Seite mit Suchbegriffen oder Schlagworten (die am Ende auch wenig mit dem Inhalt der eigentlichen Seite zu tun haben). Ich habe auch schon Seiten gesehen, die hatten einen ausgeblendeten DIV-Container auf der Seite, gespickt mit g&amp;auml;ngigen Begrifflichkeiten. In den Anf&amp;auml;ngen des Internet war ebenso beliebt, die &lt;a href="http://de.selfhtml.org/html/kopfdaten/meta.htm" tabindex="0" accesskey="L" title="zur Seite: 'http://de.selfhtml.org/html/kopfdaten/meta.htm'"&gt; META-Tag&lt;/a&gt; f&amp;uuml;r diverse g&amp;auml;ngige Suchbegriffe zu missbrauchen. Die Suchmaschinenbetreiber haben dies schnell erkannt und reagiert. Und so verwundert es nicht, wenn man dann in &lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=35769#3" tabindex="0" accesskey="L" title="zur Seite: 'http://www.google.com/support/webmasters/bin/answer.py?answer=35769#3'"&gt; Googles Richtlinien liest&lt;/a&gt;: &lt;/p&gt; &lt;p style="font-style: italic;"&gt; Erstellen Sie Seiten in erster Linie f&amp;uuml;r Nutzer, nicht f&amp;uuml;r Suchmaschinen. Versuchen Sie nicht, Ihre Nutzer zu t&amp;auml;uschen. Stellen Sie zudem keinen Content f&amp;uuml;r Suchmaschinen bereit, den Sie nicht f&amp;uuml;r Ihre Besucher verwenden. Dies wird als &amp;quot;Cloaking&amp;quot; bezeichnet. &lt;/p&gt; &lt;p&gt; Eigentlich ist dies doch klar und versteht sich von selbst. Es geh&amp;ouml;rt ohnehin zu den wohl frustrierenden Erkenntnissen eines Webbenutzers, wenn das von der Suchmaschine ermittelte Suchergebnis am Ziel vorbei f&amp;uuml;hrt.&amp;nbsp;&lt;/p&gt; &lt;p&gt; Mir ist in den Jahren aufgefallen, dass es tats&amp;auml;chlich immer hilfreich ist, das an Informationen zu offenbaren, was man anderen - den Benutzern der Seite - auch wirklich mitteilen will. Wem n&amp;uuml;tzt es, erotische &amp;quot;Fachbegriffe&amp;quot; versteckt in der Seite unterzubringen, nur weil &amp;uuml;ber Suchmaschinen h&amp;auml;ufig danach gesucht wird? Ebenso wenig f&amp;ouml;rderlich in der Sache ist es, Themenbegriffe x-Mal auf der Seite zu wiederholen. Nur weil ich gerne zum Thema &lt;a href="http://www.ajaxpro.info" tabindex="0" accesskey="L" title="zur Seite: 'http://www.ajaxpro.info'"&gt;AJAX.PRO&lt;/a&gt; schreibe, mich mit dem Thema &lt;a href="http://de.wikipedia.org/wiki/AJAX" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/AJAX'"&gt;AJAX&lt;/a&gt; leidenschaftlich gerne auseinandersetze, bringt es den Benutzer meiner Seite nicht weiter, platziere ich zu jedem Blogbeitrag diese Schlagworte. Der Benutzer der Seite freut sich vielmehr, gelangt er zielstrebig auch auf die Seite, wo ich mich mit dem Thema tats&amp;auml;chlich auseinander setze.&lt;/p&gt; &lt;p&gt; Ein weiterer Punkt, um bei Suchmaschinen erfolgreich zu sein ist es, die Regeln sauberen Webdesigns einzuhalten. Hierzu z&amp;auml;hlt ganz klar, die Vorgaben des &lt;a href="http://www.w3.org/" tabindex="0" accesskey="L" title="zur Seite: 'http://www.w3.org/'"&gt; W3C&lt;/a&gt; einzuhalten. Ich wei&amp;szlig;, dass dies oftmals recht schwierig umzusetzen ist, doch bieten die Validatoren des W3C hier eine gute Unterst&amp;uuml;tzung an: so wird eben nicht nur bei der &lt;a href="http://jigsaw.w3.org/css-validator/" tabindex="0" accesskey="L" title="zur Seite: 'http://jigsaw.w3.org/css-validator/'"&gt;CSS-Validierung&lt;/a&gt; das CSS als solches bem&amp;auml;ngelt, nein, man erh&amp;auml;lt auch gleich einen validen Vorschlag, wie die CSS-Definitionen aussehen k&amp;ouml;nnten. &amp;Auml;hnlich verh&amp;auml;lt es sich bei der &lt;a href="http://validator.w3.org/" tabindex="0" accesskey="L" title="zur Seite: 'http://validator.w3.org/'"&gt; HTML-Validierung&lt;/a&gt;. Wer dem Ganzen noch die Krone gewisserma&amp;szlig;en aufsetzen m&amp;ouml;chte, der sieht sich die &lt;a href="http://de.wikipedia.org/wiki/WCAG" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/WCAG'"&gt;Regeln&lt;/a&gt; f&amp;uuml;r &lt;a href="http://de.wikipedia.org/wiki/Barrierefreies_Internet" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/Barrierefreies_Internet'"&gt; barrierefreies Webdesign&lt;/a&gt; an. Auch hier gibt es inzwischen einen &lt;a href="http://www.contentquality.com/fulloptions.asp?rptmode=2&amp;amp;url1=&amp;amp;EMSG=%0D%0A%3Cbr%3EYou+must+enter+a+URL+to+check." tabindex="0" accesskey="L" title="zur Seite: 'http://www.contentquality.com/fulloptions.asp?rptmode=2&amp;amp;url1=&amp;amp;EMSG=%0D%0A%3Cbr%3EYou+must+enter+a+URL+to+check.'"&gt; guten Validator&lt;/a&gt;. Nun mag sich der eine oder andere sicher fragen, &lt;i&gt;&amp;quot;Warum muss die Webseite barrierefreien Grunds&amp;auml;tzen folgen?&amp;quot;&lt;/i&gt; - Ganz einfach, weil Suchmaschinen mit so genannten &lt;a href="http://de.wikipedia.org/wiki/Webcrawler" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/Webcrawler'"&gt; Crawlern&lt;/a&gt; arbeiten und diese sich mit weitgehend barrierefreien Webseiten am einfachsten tun. &lt;/p&gt; &lt;p&gt; Als ich das Weblog erstellt habe, war es f&amp;uuml;r mich oberstes Gebot alle drei Grunds&amp;auml;tze umzusetzen. Was man dabei feststellt: man macht sich viel mehr Gedanken dar&amp;uuml;ber, was man wie an Informationen vermitteln will. Aber ebenso war f&amp;uuml;r mich wichtig, Web 2.0 - Technologien - wozu unstreitig AJAX geh&amp;ouml;rt - mit einzubringen. &lt;/p&gt; &lt;p&gt; So stand letztlich die Aufgabe, die Webseite so zu gestalten, dass sie mit und ohne &lt;a href="http://de.wikipedia.org/wiki/JavaScript" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/JavaScript'"&gt; Javascript&lt;/a&gt; gleicherma&amp;szlig;en funktioniert. Sehr gute Dienste - mit Blick auf die Suchmaschinenoptimierung - hat hierbei das &lt;a href="http://www.urlrewriting.net/116/de/home.html" tabindex="0" accesskey="L" title="zur Seite: 'http://www.urlrewriting.net/116/de/home.html'"&gt; URL-Rewriting&lt;/a&gt; geleistet, denn es geh&amp;ouml;rt zu einer Regel des suchmaschinenoptimierten Webdesigns, dass Parameterketten in der URL nicht von jedem Crawler untersucht werden. &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx" tabindex="0" accesskey="L" title="zur Seite: 'http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx'"&gt; ASP.NET-MVC&lt;/a&gt; und auch &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx" tabindex="0" accesskey="L" title="zur Seite: 'http://weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx'"&gt; ASP.NET 4.0&lt;/a&gt; tragen dem Thema ebenso Rechnung.&lt;/p&gt; &lt;p&gt; Um im Rahmen der Optimierung dem Suchmaschinendienst entgegen zu kommen, bietet es sich an, eine &lt;a href="http://de.wikipedia.org/wiki/Sitemap" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/Sitemap'"&gt; Sitemap&lt;/a&gt; zu erstellen und zu pflegen. Auch hier gilt es die Regeln der Sitemaperstellung einzuhalten. Im Netz finden sich hierzu &lt;a href="http://www.google.de/search?q=sitemap+generator" tabindex="0" accesskey="L" title="zur Seite: 'http://www.google.de/search?q=sitemap+generator'"&gt; zahlreiche Anbieter&lt;/a&gt; die einen bei dieser Arbeit unterst&amp;uuml;tzen k&amp;ouml;nnen. Google selbst bietet ein Programm zur Generierung der Sitemap zum &lt;a href="http://code.google.com/p/googlesitemapgenerator/downloads/list" tabindex="0" accesskey="L" title="zur Seite: 'http://code.google.com/p/googlesitemapgenerator/downloads/list'"&gt; Download&lt;/a&gt; an. Daneben hat man bei Google die M&amp;ouml;glichkeit einen &lt;a href="http://de.wikipedia.org/wiki/RSS-Feed" tabindex="0" accesskey="L" title="zur Seite: 'http://de.wikipedia.org/wiki/RSS-Feed'"&gt; RSS-Feed&lt;/a&gt; als Sitemap zu hinterlegen.&lt;/p&gt; &lt;p&gt; Zu guter Letzt kommt man aber nicht umhin, sich selbst im Netz bekannt zu machen - diesen Part kann einem die Suchmaschine nicht abnehmen. Verlinkungen von fremden Seiten auf die eigene ist mit Blick auf die Suchmaschinenoptimierung ein nicht unwesentliches Instrumentarium. Eine weitergehende sehr gute &amp;Uuml;bersicht zur Suchmaschinenoptimierung findet man bei &lt;a href="http://suchmaschinenoptimierung.michaelsattler.de/" tabindex="0" accesskey="L" title="zur Seite: 'http://suchmaschinenoptimierung.michaelsattler.de'"&gt; Michael Sattler&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; Im Rahmen dessen sollte man Verlinkungen auch auswerten, um so festzustellen, ob man sich gut platziert hat oder ob zum Beispiel Kooperationen den erhofften Erfolg tats&amp;auml;chlich sicherstellen. F&amp;uuml;r mich ist es immer wieder interessant zu sehen, nach welchen Begriffen Benutzer &amp;uuml;ber die Suchmaschinen gesucht haben. &amp;Uuml;ber den Referrer erh&amp;auml;lt man so zum Beispiel wertvolle Informationen zu einem Themengebiet und kann inhaltlich darauf reagieren.&lt;/p&gt; &lt;p&gt; Zusammenfassend bleibt also festzustellen: die Suchmaschinen geben dem Betreiber der Webseite einiges an die Hand - es ist Sache des Betreibers, sich an die Spielregeln zu halten und das Instrument gewinnbringend einzusetzen. &lt;/p&gt; </description><link>http://weblog.drescher-hackel.de/384B1D89-9806-464B-B784-05832A27189C/SEO+-+Suchmaschinenoptimierung.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Mon, 16 Nov 2009 17:09:51 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.1046B73D-CA82-4B9E-A987-AABA1C944860.content.aspx</guid><title>Website Konzeption</title><description> &lt;p&gt;Webseiten konzipieren - das ist leichter gesagt, als am Ende umgesetzt. Sicher geht es unter Umst&amp;auml;nden recht schnell. Wer kennt es nicht aus seiner jahrelangen Berufs- und/oder Projekterfahrung. Das Erwachen folgte auf dem Fu&amp;szlig;e, wenn ein Projekt gescheitert, ein wichtiger Kunde abgesprungen ist.&lt;/p&gt; &lt;p&gt;Jens Jacobsen hat inzwischen in der 5. Auflage sein Buch &amp;quot;Webseite Konzeption&amp;quot; herausgebracht. Der Untertitel des Buches ist auch Programm: Erfolgreiche Webseites planen, umsetzen und betreiben. &lt;/p&gt; &lt;p&gt;Im Wesentlichen unterteilt sich das Buch in 6 Bereiche:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Planung&lt;/li&gt; &lt;li&gt;Konzeption&lt;/li&gt; &lt;li&gt;Umsetzung&lt;/li&gt; &lt;li&gt;Betrieb&lt;/li&gt; &lt;li&gt;Tipps f&amp;uuml;r spezielle Sites und Bereiche &lt;/li&gt; &lt;li&gt;Anhang (mit weiterf&amp;uuml;hrenden Informationen)&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; Wer sich das Buch bei seinen Projekten zu Hilfe nimmt, erf&amp;auml;hrt eine wertvolle Unterst&amp;uuml;tzung bei der Umsetzung von Grob-, Fein- und Designkonzept und hierbei auch wertvolle Tipps, wie man auf Kunden eingehen kann bzw. sollte. Jens Jacobsen ist sich aber auch bewusst, dass es nicht wenige Probleme in der Konstellation Entwickler/Auftraggeber (in der Form Arbeitnehmer/Arbeitgeber) bei der Realisierung von Projekten gibt und geht somit auch auf diese n&amp;auml;her ein.&lt;/p&gt; &lt;p&gt; Der Erfolg einer Webseite ist aber heute in entschiedenem Ma&amp;szlig;e von einer gut funktionierenden Usability abh&amp;auml;ngig. Nicht selten steht und f&amp;auml;llt ein Projekt damit. Als Projektverantwortlicher sollte man daher diesem Kapitel ein hohes Ma&amp;szlig; an Aufmerksamkeit schenken. Mit einer durchdachten guten Bedienbarkeit l&amp;ouml;sen sich oft auch andere Probleme - anders gesagt: Fehler in der Konzeption machen sich nicht selten im Usability wieder bemerkbar. &lt;/p&gt; &lt;p&gt; F&amp;uuml;r den sp&amp;auml;ter dann startenden Betrieb ist es nat&amp;uuml;rlich unerl&amp;auml;sslich, Ma&amp;szlig;nahmen der Qualit&amp;auml;tssicherung nicht nur zu planen, sondern auch umzusetzen. &lt;/p&gt; &lt;p&gt; F&amp;uuml;r eine gute Webseite reicht es eben nicht, allein guten Willen zu zeigen, sondern sich ganz klar an den Gesetzm&amp;auml;&amp;szlig;igkeiten der Webentwicklung zu halten und zu orientieren. Jens Jacobsen beschreibt hier in seinem Buch sehr gut und mit entsprechenden Beispielen untermauert, wie eine Webseite erfolgreich sein kann - und wie eben auch nicht.&lt;/p&gt; &lt;p&gt; Aus Entwicklersicht halte ich das Buch auch interessant, versteht man unter Umst&amp;auml;nden Projektverantwortliche besser (so sich diese an die in diesem Buch gegebenen Ratschl&amp;auml;ge orientieren). Gelegentlich soll es ja vorkommen, dass zu Kundengespr&amp;auml;chen/-pr&amp;auml;sentationen Entwickler mitgehen. Dann ist man gut beraten, man hat die Teile Planung und Konzeption vorher einmal gelesen.&lt;/p&gt; &lt;p&gt; Unterm Strich bleibt f&amp;uuml;r mich nur die Feststellung, dass das Buch &amp;quot;Website Konzeption&amp;quot; ein nahezu unverzichtbares Werk bei der Umsetzung von Webprojekten ist.&lt;/p&gt; &lt;p&gt; Der Autor betreibt unter &lt;a href="http://www.benutzerfreun.de" accesskey="L" tabindex="0" title="zur Seite: 'http://www.benutzerfreun.de'"&gt; http://www.benutzerfreun.de&lt;/a&gt; ein eigenes Webportal mit weiterf&amp;uuml;hrenden Informationen zu Fragen der Webseitenplanung und -konzeption.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/1046B73D-CA82-4B9E-A987-AABA1C944860/Website+Konzeption.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 15 Nov 2009 20:21:30 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.8DD51D74-573E-4D03-AAB9-B83578DD94D3.content.aspx</guid><title>Session einmal anders verwalten</title><description>&lt;p&gt; Gelegentlich ist es hilfreich, innerhalb seiner Webanwendung Informationen in eine Session abzuspeichern. Problematisch k&amp;ouml;nnte hierbei sein, dass Sessions &amp;uuml;ber einen Key verwaltet werden. Oft schon habe ich in Foren gelesen, dass Benutzer Stunden mit der Fehlersuche zugebracht haben, gleich dieser eigentlich offensichtlich war und in der fehlerhaften Schreibweise des Sessionkeys lagen.&lt;/p&gt; &lt;p&gt; Hierzu kann man &amp;uuml;ber einen recht einfachen Weg f&amp;uuml;r Klarheit sorgen: &lt;/p&gt; &lt;p&gt; Zum einen legt man sich einen Enum an, der letztlich alle Sessionkeys verwaltet. Das hat auch den entscheidenen Vorteil, dass man nicht ewig suchen muss, um herauszufinden, wie der Key richtig hei&amp;szlig;t oder ob es ihn &amp;uuml;berhaupt gibt. Gerade in Teams kann dies recht hilfreich sein. Ein anderer Vorteil ist nat&amp;uuml;rlich das einhergehende Intellisense.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild1" src="/images/extendssession/Bild1.png" style="width: 206px; height: 72px" /&gt;&lt;/p&gt; &lt;p&gt; Im zweiten Step erzeuge ich mir eine statische Klasse zum eigentlichen Verwalten der Sessions. Die Klasse - ich nenne sie mal &lt;span class="code"&gt;AppSession&lt;/span&gt; - hat zwei Methoden: &lt;span class="code"&gt;Set&lt;/span&gt; und &lt;span class="code"&gt; Get&lt;/span&gt;. Beide Methoden bekommen zum einen den &lt;span class="code"&gt;Enum&lt;/span&gt; &amp;uuml;bergeben, der den Sessionkey repr&amp;auml;sentiert und die &lt;span class="code"&gt;Set&lt;/span&gt;-Methode bekommt zus&amp;auml;tzlich den Value vom Type &lt;span class="code"&gt;object mit&amp;uuml;bergeben.&lt;/span&gt;&lt;/p&gt; &lt;p&gt; Und das war dann schon die ganze Herrlichkeit.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild2" src="/images/extendssession/Bild2.png" style="width: 505px; height: 159px" /&gt;&lt;/p&gt; &lt;p&gt; In der sp&amp;auml;teren Konsumierung schauts doch dann recht &amp;uuml;bersichtlich und leicht verst&amp;auml;ndlich aus.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild3" src="/images/extendssession/Bild3.png" style="width: 375px; height: 38px" /&gt;&lt;/p&gt; &lt;p&gt; Ja jetzt k&amp;ouml;nnte man meinen, &amp;quot;ja so k&amp;ouml;nnte man es machen, aber das geht doch auch noch viel cooler...&amp;quot;. Klar geht das.&lt;/p&gt; &lt;p&gt; Man k&amp;ouml;nnte jetzt &lt;a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" accesskey="L" tabindex="0" title="zur Seite: 'http://msdn.microsoft.com/en-us/library/bb383977.aspx'"&gt;Extension Methods&lt;/a&gt; benutzen und so das &lt;span class="code"&gt; Page.Session&lt;/span&gt;-Objekt erweitern.&lt;/p&gt; &lt;p&gt; Dann w&amp;uuml;rde das am Ende so ausschauen:&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild4" src="/images/extendssession/Bild4.png" style="width: 683px; height: 201px" /&gt;&lt;/p&gt; &lt;p&gt; Eine statische Klasse f&amp;uuml;r die erweiternden Methoden. Auch hier wieder die Methoden &lt;span class="code"&gt;Set&lt;/span&gt; und &lt;span class="code"&gt;Get&lt;/span&gt;. &lt;span class="code"&gt;this&lt;/span&gt; ist hier vom Type &lt;span class="code"&gt; System.Web.SessionState.HttpSessionState&lt;/span&gt;, damit die Erweiterung auch auf &lt;span class="code"&gt;Page.Session&lt;/span&gt; greift. Statt des Methodennamens &lt;span class="code"&gt;Set&lt;/span&gt; k&amp;ouml;nnte man auch die &lt;span class="code"&gt;Add&lt;/span&gt;-Methode &amp;uuml;berladen, &lt;/p&gt; &lt;p&gt; &lt;img alt="Bild4a" src="/images/extendssession/Bild4a.png" style="width: 631px; height: 60px" /&gt;&lt;/p&gt; &lt;p&gt; das w&amp;uuml;rde auch gehen - in diesem Fall w&amp;uuml;rde ich der Einheitlichkeit halber und der klaren Abgrenzung wegen bei &lt;span class="code"&gt;Set&lt;/span&gt; als Bezeichner bleiben wollen. Man kann auch beides implementieren.&lt;/p&gt; &lt;p&gt; Die Implementierung schaut dann vollst&amp;auml;ndig folgenderma&amp;szlig;en aus:&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild4b" src="/images/extendssession/Bild4b.png" style="width: 696px; height: 303px" /&gt;&lt;/p&gt; &lt;p&gt; Der Aufruf bleibt dann auch wieder &amp;uuml;bersichtlich und verst&amp;auml;ndlich:&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild4c" src="/images/extendssession/Bild4c.png" style="width: 357px; height: 61px" /&gt;&lt;/p&gt; &lt;p&gt; Wenn ich schon bei Erweiterungen bin, dann k&amp;ouml;nnte ich nat&amp;uuml;rlich auch den Enum erweitern um die Methoden &lt;span class="code"&gt;Get&lt;/span&gt; und &lt;span class="code"&gt;Set&lt;/span&gt;, so dass ich auf diesem Wege wieder den Sessionwert ermitteln bzw. setzen kann.&lt;/p&gt; &lt;p&gt; Die Implementierung orientiert sich dann anlog dem vorhergehenden Beispiel.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild5" src="/images/extendssession/Bild5.png" style="width: 522px; height: 330px" /&gt;&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild5a" src="/images/extendssession/Bild5a.png" style="width: 281px; height: 42px" /&gt;&lt;/p&gt; &lt;p&gt; Am Ende rufe ich in jeder Implementierung die Get/Set-Methode der statischen Klasse AppSession auf.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild6" src="/images/extendssession/Bild6.png" style="width: 504px; height: 263px" /&gt;&lt;/p&gt; &lt;p&gt; Zum Debuggen sicher von Vorteil, da ich wieder eine zentrale Stelle habe, wo ich das Setzen oder Abrufen des Sessionwertes &amp;uuml;berwachen kann.&lt;/p&gt; &lt;p&gt; Der Vollst&amp;auml;ndigkeit halber sollte man auch eine Remove-Methode nach der selben Vorgehensweise implementieren.&lt;/p&gt; &lt;p&gt; Den vollst&amp;auml;ndigen Code findet ihr unter &lt;a href="http://dotnet-snippets.de/dns/sessionverwaltung-einmal-anders-SID1257.aspx" tabindex="0" accesskey="L" title="zur Seite: 'http://dotnet-snippets.de/dns/sessionverwaltung-einmal-anders-SID1257.aspx'"&gt;dotnet-snippets.de hier&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; Nach Abschluss des Snippet-Wettbewerbes, also ab dem 13.12.09 gibt es die Beispielklasse nebst Enumbeispiel hier auch zum Download als Visual Studio 2008 Projekt.&lt;/p&gt; &lt;p&gt; Viel Spass beim Ausprobieren.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/8DD51D74-573E-4D03-AAB9-B83578DD94D3/Session+einmal+anders+verwalten.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 14 Nov 2009 18:30:16 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.AB0D32C0-EA51-4BE7-B866-484128856110.content.aspx</guid><title>Optimierungsmöglichkeiten mit dem Scripmanager</title><description>&lt;p&gt; Wer im Rahmen seiner Anwendungsentwicklung geneigt ist, das AjaxToolkit einzusetzen, dem m&amp;uuml;ssten dann und wann schon einmal Bedenken hinsichtlich der Performance gekommen sein. Mich hat es die Tage jedenfalls besch&amp;auml;fftigt, so dass ich mich im Netzt einmal auf die Suche nach einer passenden L&amp;ouml;sung gemacht habe.&lt;/p&gt; &lt;p&gt; In &lt;a href="http://lancezhang.wordpress.com/2008/11/15/aspnet-ajax-performance/" accesskey="L" tabindex="0" title="zur Seite: http://lancezhang.wordpress.com/2008/11/15/aspnet-ajax-performance/" target="blank"&gt; diesem Blogbeitrag&lt;/a&gt; bin ich dann f&amp;uuml;ndig geworden. Ein interessanter Aspekt ist sicher der Einsatz von &lt;a href="http://www.httpwatch.com/download/" accesskey="L" tabindex="0" title="zur Seite: http://www.httpwatch.com/download/" target="blank"&gt; HttpWatch&lt;/a&gt;. Es muss jedoch erw&amp;auml;hnt werden, dass mit &lt;a href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt; &amp;auml;hnliche Informationen sich ermitteln lassen. Ebenso gut bekommt man auch Informationen &amp;uuml;ber &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843" accesskey="L" tabindex="0" title="zur Seite: https://addons.mozilla.org/en-US/firefox/addon/1843" target="blank"&gt;Firebug&lt;/a&gt; angezeigt. Seit dem Internet Explorer 8 kommt dieser mit einem recht ordentlichen Entwicklertool daher, das sich &amp;uuml;ber F12 aufrufen l&amp;auml;sst.&lt;/p&gt; &lt;p&gt; &lt;img alt="Bild1" src="/images/toolkitperformance/bild1.png" style="width: 800px; height: 292px" /&gt;&lt;/p&gt; &lt;p&gt; &amp;uuml;ber den Tab &amp;quot;Profiler&amp;quot; kann man das Lade- und Aufrufverhalten seiner Javascripte genau analysieren.&lt;/p&gt; &lt;p&gt; Was die Einstellungen in der web.config-Datei angeht, ist man sicher gut beraten, wenn man &lt;a href="http://www.asp.net/AJAX/documentation/live/ConfiguringASPNETAJAX.aspx#microsoftweb" accesskey="L" tabindex="0" title="zur Seite: http://www.asp.net/AJAX/documentation/live/ConfiguringASPNETAJAX.aspx#microsoftweb" target="blank"&gt; hier&lt;/a&gt; noch einmal nachliest. Der f&amp;uuml;r mich interessante Part war die Einstellungen zur Kompression und zum Cacheverhalten, wie in dem &lt;a href="http://lancezhang.wordpress.com/2008/11/15/aspnet-ajax-performance/" accesskey="L" tabindex="0" title="zur Seite: http://lancezhang.wordpress.com/2008/11/15/aspnet-ajax-performance/" target="blank"&gt; o.g. Blogbeitrag&lt;/a&gt; erw&amp;auml;hnt.&lt;/p&gt; &lt;p&gt; Um die Einstellung &lt;span class="code"&gt;EnablePartialRendering=&amp;quot;true&amp;quot;&lt;/span&gt; kommt man indes beim Updatepanel wohl nicht herum. Auch kann ich die Aussage nicht teilen, &lt;span class="code"&gt;LoadScriptBeforUI=&amp;quot;false&amp;quot;&lt;/span&gt; sei eine optimale Einstellung. Ich habe z.B. den CalendarExtender innerhalb eines Updatepanels im Einsatz und da l&amp;ouml;st &lt;span class="code"&gt; LoadScriptBeforUI=&amp;quot;false&amp;quot;&lt;/span&gt; ein Fehlverhalten in der Form aus, dass der Extender erst gar nicht funktioniert. Erst wenn ich &lt;span class="code"&gt; LoadScriptBeforUI=&amp;quot;true&amp;quot;&lt;/span&gt; setze, funktioniert auch der Extender wieder. Ich denke, hier muss jeder den Einzelfall ber&amp;uuml;cksichtigen.&lt;/p&gt; &lt;p&gt; Eine vorteilhafte Entscheidung ist es jedoch, statt des Standardscriptmanagers den des AjaxToolkit einzusetzen. Dieser verf&amp;uuml;gt &amp;uuml;ber eine M&amp;ouml;glichkeit, nur die Scripte des Toolkit zu laden, deren Controls auf der Seite auch verarbeitet werden. &lt;/p&gt; &lt;p&gt; Mit der Eigenschaft &lt;span class="code"&gt;CombineScripts=&amp;quot;true&amp;quot;&lt;/span&gt; und der Angabe eines HttpHandlers in der Eigenschaft &lt;span class="code"&gt; CombineScriptsHandlerUrl&lt;/span&gt; kann man den ToolkitScriptmanger dazu bringen, die Scripte nicht einzeln zu laden sondern die Scriptressourcen in einer zusammenzufassen.&lt;/p&gt; &lt;p&gt; Im HttpHandler muss man lediglich folgenden Aufruf platzieren: &lt;/p&gt; &lt;p class="code"&gt; ToolkitScriptManager.OutputCombinedScriptFile(context)&lt;/p&gt; &lt;p&gt; Man ist gut beraten, sollte der Aufruf &lt;span class="code"&gt;false&lt;/span&gt; zur&amp;uuml;ckgeben, dies entsprechend auszuwerten.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/AB0D32C0-EA51-4BE7-B866-484128856110/Optimierungsm%c3%b6glichkeiten+mit+dem+Scripmanager.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 08 Nov 2009 18:02:56 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.147DCE60-7A67-4A8D-B520-F7FC44438924.content.aspx</guid><title>Keine Angst vor Javascript</title><description> &lt;p&gt; Mit der Entwicklung von Custom Webcontrols sind oft sehr klare Vorstellungen verbunden, was das Control im Einzelnen leisten soll. Oft sind auch Anforderungen allein in der Gestalt gegeben, dass auf allen Seiten, die das Control verwenden (sollen) ein einheitliches Markup verwendet wird. Knifflig wird es oft dann, wenn controlspezifisches Javascript mit eingebunden werden muss.&lt;/p&gt; &lt;p&gt; Nicht dass dies an sich ein Problem w&amp;auml;re - hierzu wird oft eine Javascriptdatei als Ressource im Control eingebettet und mit ausgeliefert. &lt;/p&gt; &lt;p&gt; Nein, die Problematik stellt sich oft in der Funktionalit&amp;auml;t des Javascripts. Hier steht z.B. jQuery als komplexe Javascript-Bibliothek im Raum - aber kann ich jQuery als Controlentwickler voraussetzen? Die n&amp;auml;chste Frage, die sich stellt, ist die nach der richtigen Version? Oder liefer ich &amp;uuml;ber das Control stillheimlich eine Version der jQuery-Bibliothek mit aus - aber was, wenn in der Seite eine andere Version schon eingebunden ist oder gar eine konkurrierende Bibliothek in der Seite schon Anwendung findet?&lt;/p&gt; &lt;p&gt; Diese Fragen haben mich erst k&amp;uuml;rzlich besch&amp;auml;ftigt: ich bin zu dem Schluss gekommen, dass ein Control sich nie auf eine externe Bibliothek verlassen darf - eine derartige Abh&amp;auml;ngigkeit halte ich in der Controlentwicklung f&amp;uuml;r sch&amp;auml;dlich. Ein weiteres Argument gegen eine solche Abh&amp;auml;ngigkeit ist die Tatsache, dass man nie wei&amp;szlig;, wo das Custom Control letztendlich eingesetzt werden soll. Aus diesen Gr&amp;uuml;nden pl&amp;auml;diere ich daf&amp;uuml;r, sich stets auf das eigene Javascript zu verlassen.&lt;/p&gt; &lt;p&gt; &lt;b&gt;1. Javascript != AJAX&lt;/b&gt;&lt;/p&gt; &lt;p&gt; Auf der diesj&amp;auml;hrigen BASTA-Konferenz war ich allerdings etwas erschrocken &amp;uuml;ber die Aussage eines namhaften Buchautoren, der den Standpunkt vertrat, dass man es doch lieber lassen sollte mit den Webanwendungen, die Javascript konsumieren. Ich weigere mich in diesem Zusammenhang alles als AJAX-Anwendung zu bezeichnen, nur weil Javascript zum Einsatz kommt. Sein Argument, dass oft das Know-How und das Budget f&amp;uuml;r solche Anwendungen in den Firmen nich ausreichend vorhanden sei, ist allenfalls etwas schwach, wenn man bedenkt, welche Alternative er vorgeschlagen hat - Silverlight. Kurioserweise brachte er aber ein Beispiel (die Zahlen auf Genauigkeit mal dahingestellt), dass im Vergleich zu Silverlight 10 Mal mehr Flash-Entwickler derzeit gesucht werden. Aber &amp;uuml;ber diesen Standpunkt zum Thema Javascript k&amp;ouml;nnte man sicher B&amp;uuml;cher schreiben...&lt;/p&gt; &lt;p&gt; Fehlendes Know-How im Bereich Javascript kann man durch die entsprechende Lekt&amp;uuml;re sicher begegnen. Un&lt;a style="text-decoration: line-through;"&gt;schlagbar&lt;/a&gt;verzichtbar in diesem Zusammenhang ist f&amp;uuml;r mich die Referenz bei &lt;i&gt;&lt;a href="http://de.selfhtml.org" accesskey="L" tabindex="0" title="zur Seite: de.selfhtml.org" &gt; selfHTML&lt;/a&gt;&lt;/i&gt;. &lt;/p&gt; &lt;p&gt; &lt;b&gt;2. Vor&amp;uuml;berlegungen&lt;/b&gt;&lt;/p&gt; &lt;p&gt; In diesem Beitrag m&amp;ouml;chte ich heute einmal aufzeigen, dass es gar nicht so schwer ist, mit dem Javascript.&lt;/p&gt; &lt;p&gt; Nehmen wir z.B. den immer wieder in den Foren nachgefragten Fall, dass ein DIV-Container weitere Elemente enth&amp;auml;lt und dieser sich durch einen Klick innerhalb eines bestimmten Bereiches zusammenklappen bzw. ausklappen soll. Dabei sollen aber weiche &amp;Uuml;berg&amp;auml;nge m&amp;ouml;glich sein. &lt;/p&gt; &lt;p&gt; Also das Beispiel sollte dann so aussehen:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample1" src="/images/javascript/sample1.png" style="width: 376px; height: 414px" /&gt;&lt;/p&gt; &lt;p&gt; Das k&amp;ouml;nnte gleicherma&amp;szlig;en ein Custom Control sein, deren Erstellung ich aber heute nicht demonstrieren m&amp;ouml;chte. Bei einem Klick auf den hier grau markierten Kopfbereich sollte der darunter liegende Inhaltsbereich einrollen und weich ausgeblendet werden. Beim erneuten Klick sollte der Inhaltsbereich wieder ausrollen und entsprechend weich eingeblendet werden.&lt;/p&gt; &lt;p&gt; Um dieses Vorhaben zu realisieren, sollte man sich mit den Grundlagen des CSS befassen, damit man wei&amp;szlig;, welcher Effekt sich mit welcher Styleeigenschaft umsetzen l&amp;auml;sst. Unverzichtbare Quelle in diesem Zusammenhang ist neben &lt;i&gt;&lt;a href="http://de.selfhtml.org" accesskey="L" tabindex="0" title="zur Seite: de.selfhtml.org"&gt; selfHTML&lt;/a&gt;&lt;/i&gt; auch die Seite &lt;i&gt;&lt;a href="http://www.css4you.de" accesskey="L" tabindex="0" title="zur Seite: www.css4you.de"&gt;css4you&lt;/a&gt;&lt;/i&gt;. &lt;/p&gt; &lt;p&gt; Der Container an sich ist recht einfach, wie das folgende Markup zeigt:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample3" src="/images/javascript/Sample3.png" style="width: 211px; height: 131px" /&gt;&lt;/p&gt; &lt;p&gt; Was man in diesem Zusammenhang wissen muss ist, dass die DIV-Elemente sogenannte Block-Elemente und daher immer untereinander angeordnet sind.&lt;/p&gt; &lt;p&gt; Damit das ganze etwas freundlicher aussieht, bekommen die einzelnen DIV-Elemente ein Style &amp;uuml;ber das &lt;i&gt;&lt;a href="http://de.selfhtml.org/css/formate/zentrale.htm" accesskey="L" tabindex="0" title="Beschreibung des class-Attributes"&gt;class&lt;/a&gt;&lt;/i&gt;-Attribute zugewiesen. &lt;/p&gt; &lt;p&gt; F&amp;uuml;r den &amp;auml;u&amp;szlig;eren umschlie&amp;szlig;enden Container kommt folgendes Css zur Anwendung:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample4" src="/images/javascript/Sample4.png" style="width: 346px; height: 137px" /&gt;&lt;/p&gt; &lt;p&gt; Hier ist wichtig, dass die Eigenschaft &lt;i&gt;&lt;a href="http://www.css4you.de/overflow.html" accesskey="L" tabindex="0" title="Beschreibung der overflow-Eigenschaft"&gt; overflow&lt;/a&gt;&lt;/i&gt; auf &lt;i&gt;hidden&lt;/i&gt; gesetzt ist und im &amp;Uuml;brigen keine H&amp;ouml;he zugewiesen wird.&lt;/p&gt; &lt;p&gt; F&amp;uuml;r das innere obere DIV-Element kommt folgendes Css zur Anwendung:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample5" src="/images/javascript/Sample5.png" style="width: 346px; height: 137px" /&gt;&lt;/p&gt; &lt;p&gt; Im Gegensatz zum umschlie&amp;szlig;enden DIV-Element ist es hier wichtig, eine feste H&amp;ouml;he zu setzen. Die anderen Angaben dienen der allgemeinen Kosmetik.&lt;/p&gt; &lt;p&gt; Zum Schluss erh&amp;auml;lt das zweite innere DIV-Element noch einen individuellen Style zugewiesen:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample6" src="/images/javascript/Sample6.png" style="width: 420px; height: 154px" /&gt;&lt;/p&gt; &lt;p&gt; Wichtig ist auch hier wieder die &lt;i&gt;overflow&lt;/i&gt;-Eigenschaft, welche auf &lt;i&gt;hidden&lt;/i&gt; gesetzt werden muss und dass keine feste H&amp;ouml;he zugewiesen wird.&lt;/p&gt; &lt;p&gt; Wenn denn alles richtig umgesetzt wurde, sollte folgendes Bild sich ergeben:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample8" src="/images/javascript/Sample8.png" style="width: 383px; height: 213px" /&gt;&lt;/p&gt; &lt;p&gt; Es wird deutlich, dass der Inhaltscontainer in der H&amp;ouml;he von seinem eigentlichen Inhalt bestimmt wird - in diesem Fall ist noch kein Inhalt vorhanden, weshalb das zweite innere DIV-Element faktisch nicht zu sehen ist. Verantwortlich ist hierf&amp;uuml;r die Eigenschaft &lt;i&gt;&lt;a href="http://www.css4you.de/overflow.html" accesskey="L" tabindex="0" title="Beschreibung der overflow-Eigenschaft"&gt;overfow&lt;/a&gt;&lt;/i&gt;, welche auf &lt;i&gt;hidden&lt;/i&gt; steht. Lediglich das DIV-Element mit einer festen H&amp;ouml;he ist zu sehen.&lt;/p&gt; &lt;p&gt; &lt;b&gt;3. Das Javascript&lt;/b&gt;&lt;/p&gt; &lt;p&gt; Kommen wir nun zu den &amp;Uuml;berlegungen zum Javascript: was wir wissen ist, dass die DIV-Elemente einen zugewiesenen Wert auf dem &lt;i&gt;class&lt;/i&gt;-Attribute haben. Weiterhin ist die Struktur des gesamten Containers bekannt - ein DIV-Element mit zwei DIV-Elementen, wobei der erste das Event zum Verhalten des zweiten ausl&amp;ouml;sen soll.&lt;/p&gt; &lt;p&gt; Orientiert an die Custom-Control-Entwicklung w&amp;uuml;rde ich ein Javascriptobjekt vorziehen, wobei ich im &lt;i&gt;window-onload&lt;/i&gt;-Eventhandler keine zus&amp;auml;tzliche Instanziierung vornehmen m&amp;uuml;sste. &lt;/p&gt; &lt;p&gt; &lt;img alt="Sample9" src="/images/javascript/Sample9.png" style="width: 355px; height: 154px" /&gt;&lt;/p&gt; &lt;p&gt; Die runden Klammern (rot markiert) bewirken, dass &lt;i&gt;Container&lt;/i&gt; nicht nur die Definition des Objektes ist, sondern auch zugleich die Instanz dessen, so dass sofort damit gearbeitet werden kann. &lt;/p&gt; &lt;p&gt; Im Rahmen der Controlentwicklung gilt es jedoch den Click-Event zu registrieren. Hierzu kann man das Attribute &lt;i&gt;onclick&lt;/i&gt; setzen und den Methodenaufruf direkt angeben. Wichtig ist hierbei, den Parameter &lt;i&gt;event&lt;/i&gt; genau so mitzugeben, damit bei den Browsern, welche das &lt;i&gt;window.event&lt;/i&gt;-Objekt nicht kennen/unterst&amp;uuml;tzen, dieses zur Verf&amp;uuml;gung steht. &amp;Uuml;ber das &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/objekte/event.htm" accesskey="L" tabindex="0" title="Beschreibung des event-Objektes"&gt; event&lt;/a&gt;&lt;/i&gt;-Objekt kann man letztlich immer erfahren, &amp;uuml;ber welches DOM-Element das Event ausgel&amp;ouml;st wurde.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample10" src="/images/javascript/Sample10.png" style="width: 662px; height: 19px" /&gt;&lt;/p&gt; &lt;p&gt; Im Fall der vorgestellten Beispielanwendung, ziehe ich es vor, das Event &amp;uuml;ber das &amp;uuml;bergeordnete DIV-Element zu binden.&lt;/p&gt; &lt;p class="subTitel"&gt; 3.1 Die Klick-Methode&lt;/p&gt; &lt;p&gt; Um das Event auch zu verarbeiten, bedarf es der Klick-Methode. Diese wird im &amp;ouml;ffentlichen Bereich der o.g. Javascriptdefinition definiert. Dies kann in zwei Formen geschehen: zum einen, indem auf eine interne Methode verwiesen wird (was ich vorziehe), zum anderen, indem die Methode direkt definiert wird.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample11" src="/images/javascript/Sample11.png" style="width: 538px; height: 358px" /&gt;&lt;/p&gt; &lt;p&gt; Wird im &lt;i&gt;public&lt;/i&gt;-Bereich auf eine interne (&lt;i&gt;private&lt;/i&gt;) Methode verwiesen, so geschieht dies nur durch Angabe des Methodennamens - ohne die Signatur. Im sp&amp;auml;teren Aufruf muss dann aber die (&lt;i&gt;public&lt;/i&gt;) Methode immer mit der vollst&amp;auml;ndigen Methodensignatur (wie sie die &lt;i&gt;private&lt;/i&gt; Methode vorgibt) aufgerufen werden.&lt;/p&gt; &lt;p&gt; Innerhalb der &lt;i&gt;_click&lt;/i&gt;-Methode stellen wir als erstes fest, wer das Event eigentlich ausgel&amp;ouml;st hat. Hierbei sto&amp;szlig;en wir auf eine immer noch bestehende Browserproblematik: der Internet Explorer versteht als einziges das &lt;i&gt;window.event&lt;/i&gt;-Objekt, w&amp;auml;hrend die &amp;uuml;brigen Browser das Eventobjekt &amp;uuml;ber die Argumentenliste der Methode transportieren. Man sollte jedoch wissen, dass das Eventobjekt nur ankommt, wenn im onclick-Attribut &lt;i&gt;event&lt;/i&gt; so mit angegeben wurde. Wurde zum Beispiel &lt;i&gt;onclick=&amp;quot;Container.Click(evt)&amp;quot;&lt;/i&gt; angegeben, dann kann auch Firefox &amp;amp; Co. nichts damit anfangen. Innerhalb des aufgerufenen Eventhandlers gelangt man dann nicht mehr an das Eventobjekt. Der Internet Explorer hingegen kann innerhalb des Eventhandlers das Eventobjekt bestimmen. Daher erfolgt zu Gunsten der Browserkompatibilit&amp;auml;t als erstes in der Klick-Methode die Pr&amp;uuml;fung nach dem Eventobjekt.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample12" src="/images/javascript/Sample12.png" style="width: 402px; height: 90px" /&gt;&lt;/p&gt; &lt;p&gt; Wie ich weiter oben schon erw&amp;auml;hnte, kann man &amp;uuml;ber das Eventobjekt feststellen, welches DOM-Element das Event ausgel&amp;ouml;st hat. Auch hier stolpert man wieder &amp;uuml;ber eine Browserbesonderheit: der Internet Explorer kennt die Eigenschaft &lt;i&gt;srcElement&lt;/i&gt;, w&amp;auml;hrend die anderen Browser die &lt;i&gt;target&lt;/i&gt;-Eigenschaft verstehen. Hier sollte man sich in der Pr&amp;uuml;fung der Browserkompatibilit&amp;auml;t auf die Abfrage der geforderten Eigenschaft verlassen und nicht auf das &lt;i&gt;navigator&lt;/i&gt;-Objekt.&amp;nbsp; Wenn das DOM-Element&amp;nbsp; feststeht, versuchen wir als erstes das &lt;i&gt;class&lt;/i&gt;-Attribute zu bestimmen. An dieser Stelle kann man ebenso gut das &lt;i&gt;id&lt;/i&gt;-Attribut erfragen, doch m&amp;ouml;chte ich mich hier auf das &lt;i&gt;class&lt;/i&gt;-Attribute beschr&amp;auml;nken. Beachten sollte man hier aber, dass das Attribute zwar &lt;i&gt;class&lt;/i&gt; hei&amp;szlig;t, im Javascript aber &amp;uuml;ber &lt;i&gt;className&lt;/i&gt; ermittelt wird. Bisweilen ist im Netz auch zu lesen, dass die einzige richtige Syntax die ist, wo der Eigenschaftsname in eckigen Klammern &lt;i&gt;objekt[&amp;quot;eigenschaft&amp;quot;]&lt;/i&gt; angegeben wird. Ich bevorzuge hier jedoch die im .NET auch &amp;uuml;bliche Punktnotation (&lt;i&gt;objekt.eigenschaft&lt;/i&gt;) - beides f&amp;uuml;hrt zum gleichen Ergebnis.&lt;/p&gt; &lt;p&gt; Von daher erweitert sich die Klick-Methode folgenderma&amp;szlig;en:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample13" src="/images/javascript/Sample13.png" style="width: 557px; height: 172px" /&gt;&lt;/p&gt; &lt;p&gt; Wenn das &lt;i&gt;class&lt;/i&gt;-Attribute den Wert &lt;i&gt;panel&lt;/i&gt; hat, dann soll die eigentliche Verarbeitung weiter gehen. Ist dies der Fall, gilt es das nachfolgende DOM-Element mit der css-Klasse &lt;i&gt;content&lt;/i&gt; zu ermitteln. Und wie sollte es anders sein, treffen wir hier erneut auf eine Browserbesonderheit, wo sich die Geister scheiden, welcher Browser das richtige Ergebnis liefert. W&amp;auml;hrend der Internet Explorer lediglich die &lt;a style="text-decoration: line-through"&gt;echten&lt;/a&gt; DOM-Elemente findet, ber&amp;uuml;cksichtigen die anderen Browser alle Elemente - auch die nicht sichtbaren, wie den Zeilenvorschub &lt;i&gt;\n&lt;/i&gt;. Das richtige Element zu ermitteln ist allerdings nicht so schwer: jedes DOM-Element verf&amp;uuml;gt &amp;uuml;ber eine Eigenschaft &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/objekte/node.htm#node_type" accesskey="L" tabindex="0" title="Beschreibung der nodeType-Eigenschaft"&gt; nodeType&lt;/a&gt;&lt;/i&gt;. Ist der Wert gleich 1, so haben wir ein HTML-Tag gefunden - und genau diese Elemente suchen wir ja. Um jetzt alle nachfolgende Elemente auf diese Eigenschaften zu &amp;uuml;berpr&amp;uuml;fen, bietet sich eine &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/sprache/schleifen.htm#while" accesskey="L" tabindex="0" title="Beschreibung der while-Methode"&gt; while&lt;/a&gt;&lt;/i&gt;-Schleife an. Diese wird so lange durchlaufen, wie das &lt;i&gt;class&lt;/i&gt;-Attribute &lt;i&gt;undefined&lt;/i&gt; ist (oder ein Element mit dem nodeType vom Wert 1 gefunden wurde). Das jeweils folgende Element erh&amp;auml;lt man immer &amp;uuml;ber die Eigenschaft &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/objekte/node.htm#next_sibling" accesskey="L" tabindex="0" title="Beschreibung der nextSibling-Eigenschaft"&gt; nextSibling&lt;/a&gt;&lt;/i&gt;.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample14" src="/images/javascript/Sample14.png" style="width: 588px; height: 224px" /&gt;&lt;/p&gt; &lt;p&gt; Wie ich im Ergebnis sp&amp;auml;ter demonstrieren werde, kann man nat&amp;uuml;rlich mehrere Elemente mit dieser Funktionalit&amp;auml;t endlos in einander verschachteln. Es empfiehlt sich daher an dieser Stelle das durchreichen (&lt;i&gt;bubble&lt;/i&gt;) des Events abzubrechen. Alle aktuellen Browser verstehen die Eigenschaft &lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms533545(VS.85).aspx" accesskey="L" tabindex="0" title="Beschreibung der cancelBubble-Eigenschaft"&gt; event.cancelBubble&lt;/a&gt;&lt;/i&gt;, wobei &lt;a href="https://developer.mozilla.org/En/DOM/Event.cancelBubble" accesskey="L" tabindex="0" title="Beschreibung der cancelBubble-Eigenschaft"&gt; doch empfohlen wird&lt;/a&gt;, die Methode &lt;i&gt;&lt;a href="https://developer.mozilla.org/en/DOM/event.stopPropagation" accesskey="L" tabindex="0" title="Beschreibung der stopPropagation-Methode"&gt; stopPropagation&lt;/a&gt;&lt;/i&gt; aufzurufen, welche der Internet Explorer jedoch nicht kennt.&lt;/p&gt; &lt;p&gt; Der nun folgende Schritt ist etwas trickreich, erinnert aber auch leicht an die Vorgehensweise im &lt;a href="http://www.jquery.com" accesskey="L" tabindex="0" title="zur Seite: www.jquery.com"&gt;jQuery&lt;/a&gt;. Im sp&amp;auml;teren Verlauf ist es wichtig, jedes Objekt eindeutig identifizieren zu k&amp;ouml;nnen. Hierzu wollen wir aber nicht immer durch den DOM itterieren, zudem uns durch die gewollte DOM-Manipulation wichtige Informationen verloren gehen. Aus diesem Grund verf&amp;uuml;gt unser Javascriptobjekt &lt;i&gt;Container&lt;/i&gt; eine &lt;i&gt;private&lt;/i&gt; Eigenschaft &lt;i&gt;elements&lt;/i&gt; vom Type &lt;i&gt;Array. &lt;/i&gt;Dieses Array werden wir im Folgenden &amp;ouml;fter durchsuchen, so dass ich zus&amp;auml;tzlich eine &lt;i&gt;prototype&lt;/i&gt;-Methode &lt;i&gt;find&lt;/i&gt; implementieren werde. Um alle Elemente in diesem Array eindeutig identifizieren zu k&amp;ouml;nnen, weisen wir dem &lt;i&gt;nextElement&lt;/i&gt; die Eigenschaft &lt;i&gt;guid&lt;/i&gt; zu. Eine M&amp;ouml;glichkeit zum Erzeugen einer solchen GUID habe ich &lt;a href="http://note19.com/2007/05/27/javascript-guid-generator/" accesskey="L" tabindex="0" title="GUID Generator mit Javascript"&gt;hier&lt;/a&gt; gefunden. Weiterhin speichern wir den derzeitigen Offsetwert der Elementh&amp;ouml;he &amp;uuml;ber die Eigenschaft &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/objekte/all.htm#offset_height" accesskey="L" tabindex="0" title="Beschreibung der offsetHeight-Eigenschaft"&gt; offsetHeight&lt;/a&gt;&lt;/i&gt; ab. Das Hinzuf&amp;uuml;gen des &amp;uuml;ber die o.g. while-Schleife gefundenen DOM-Elementes erfolgt nur ein einziges Mal - n&amp;auml;mlich, wenn das Element noch nicht die Eigenschaft &lt;i&gt;guid&lt;/i&gt; zugewiesen bekam.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample14a" src="/images/javascript/Sample14a.png" style="width: 600px; height: 115px" /&gt;&lt;/p&gt; &lt;p&gt; Die Definition der &lt;a href="http://aktuell.de.selfhtml.org/artikel/javascript/oomodell/#inheritance" accesskey="L" tabindex="0" title="Beschreibung des Prototype-Modell"&gt; Prototype&lt;/a&gt;-Methode f&amp;uuml;r das Array-Objekt ist ebenfalls recht einfach: hier wird lediglich das Array &amp;uuml;ber eine for-Schleife durchlaufen und wenn die &lt;i&gt;id&lt;/i&gt;-Eigenschaft im Array-Element mit der &amp;uuml;ber die &lt;i&gt;find&lt;/i&gt;-Methode &amp;uuml;bergebenen &lt;i&gt;id&lt;/i&gt; &amp;uuml;bereinstimmt, dann gibt die &lt;i&gt;find&lt;/i&gt;-Methode genau das Array-Element an den Aufrufer zur&amp;uuml;ck.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample14b" src="/images/javascript/Sample14b.png" style="width: 498px; height: 170px" /&gt;&lt;/p&gt; &lt;p&gt; Nun sind wir schon fast am Ende der Klick-Methode angekommen. Bleibt nur noch das Eigentliche - n&amp;auml;mlich die Implementierung des Ein- bzw. Ausrollen des Inhaltselements. Die Unterscheidung, was beim Klick-Event zu tun ist, kann zum Beispiel &amp;uuml;ber die aktuelle H&amp;ouml;he des Elements erfolgen. Nachteilig ist hierbei, dass man nicht die Werte eines m&amp;ouml;glichen Rahmens, wenn diese in der css-Klasse gesetzt sind, zweifelsfrei ermitteln kann. Besser erscheint es mir hier, dem Element eine weitere Statuseigenschaft zuzuweisen. F&amp;uuml;r das eigentliche Ein- bzw. Ausrollen der Elemente habe ich zwei weitere &lt;i&gt;private&lt;/i&gt; Methoden implementiert. Innerhalb dieser Methoden wird die Eigenschaft &lt;i&gt;scrollOut&lt;/i&gt; gesetzt.&lt;/p&gt; &lt;p class="subTitel"&gt; 3.2. Die scrollOut-Methode &lt;/p&gt; &lt;p&gt; F&amp;uuml;r das Ein- bzw. Ausrollen des Inhaltsbereich kommt eigentlich nur eines in Frage -&amp;nbsp; das dynamische Ver&amp;auml;ndern der H&amp;ouml;he des Elementes. Die Frage, die sich hierbei stellt, ist die Form der Umsetzung. &lt;/p&gt; &lt;p&gt; Da w&amp;auml;re die &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/sprache/schleifen.htm#for" accesskey="L" tabindex="0" title="Beschreibung der for-Methode"&gt; for&lt;/a&gt;&lt;/i&gt;-Schleife, die &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/sprache/schleifen.htm#while" accesskey="L" tabindex="0" title="Beschreibung der while-Methode"&gt; while&lt;/a&gt;&lt;/i&gt;-Schleife oder der &lt;a href="http://de.selfhtml.org/perl/sprache/schleifen.htm#rekursion" accesskey="L" tabindex="0" title="Beschreibung einer Rekursion"&gt; rekursive Aufruf einer Methode&lt;/a&gt;. Alle L&amp;ouml;sungsans&amp;auml;tze haben aber ein Manko gemeinsam - sie k&amp;ouml;nnen nicht warten. Mir ist kein Befehl im Javascript bekannt, der analog einer PAUSE 20 Anweisung im guten alten BASIC enspricht. Wenn man aber in bestimmten Abst&amp;auml;nden etwas immer und immer wieder aufrufen bzw. abarbeiten lassen m&amp;ouml;chte, so kommt dies einem Intervallverhalten nahe. Und genau daf&amp;uuml;r gibt es im Javascript eine entsprechende Methode im &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/objekte/window.htm" accesskey="L" tabindex="0" title="Beschreibung des window-Objekts"&gt; window&lt;/a&gt;&lt;/i&gt;-Objekt: &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/objekte/window.htm#set_interval" accesskey="L" tabindex="0" title="Beschreibung der setInterval-Methode"&gt; window.setInterval&lt;/a&gt;&lt;/i&gt;. &lt;i&gt;(Anmerk.: man k&amp;ouml;nnte aber auch eine Methode rekursiv aufrufen und innerhalb der Methode mit der Anweisung setTimeout arbeiten.). &lt;/i&gt;Ein weiterer Vorteil an der Methode &lt;i&gt;setInterval&lt;/i&gt; ist, dass man hier einen Zeitwert in Millisekunden mit angeben kann, in welchen Abst&amp;auml;nden das Intervall aufgerufen werden soll.&lt;/p&gt; &lt;p&gt; Wichtig bei der Verwendung der Methode &lt;i&gt;setInterval&lt;/i&gt; ist die Zuweisung der von &lt;i&gt;setInterval&lt;/i&gt; zur&amp;uuml;ckgegebenen &lt;i&gt;IntervalID&lt;/i&gt; an eine Variable. Ohne diese &lt;i&gt;IntervalID&lt;/i&gt; kann sonst der Vorgang nicht abgebrochen werden. Um diesen Intervallabbruch zu erzeugen, ben&amp;ouml;tigen wir eine Abbruchbedingung.&lt;/p&gt; &lt;p&gt; Beim Ausrollen des Inhaltsbereiches ist die Abbruchbedingung eigentlich klar: das Element hat die zul&amp;auml;ssige maximale H&amp;ouml;he erreicht. Und an dieser Stelle kommen wir zur&amp;uuml;ck auf die Klick-Methode: hier hatte ich die Offseth&amp;ouml;he des Elements in einem separaten Objekt erstmals zwischen gespeichert.&lt;/p&gt; &lt;p&gt; Nach all diesen Vor&amp;uuml;berlegungen kann es nun an den Code gehen:&lt;/p&gt; &lt;p&gt; Die Methode &lt;i&gt;_scrollOut&lt;/i&gt; bekommt als Parameter das entsprechende DOM-Element mit &amp;uuml;bergeben. Im ersten Schritt merken wir uns den Status &amp;uuml;ber eine zus&amp;auml;tzliche Eigenschaft - &lt;i&gt;scrollOut&lt;/i&gt; - indem wir sie auf &lt;i&gt;true&lt;/i&gt; setzen. Dies ist vor allem f&amp;uuml;r die Momente interessant, wo der Benutzer w&amp;auml;hrend des Ausrollens das Einrollen des Elementes veranlasst (dazu weiter unten mehr). Dann holen wir &amp;uuml;ber die &lt;i&gt;find&lt;/i&gt;-Methode das Array-Element, welches der &lt;i&gt;guid&lt;/i&gt;-Eigenschaft des &amp;uuml;bergebenen DOM-Elementes entspricht. Haben wir dieses Element innerhalb des Array &lt;i&gt;elements&lt;/i&gt; gefunden, kann die weitere Verarbeitung erfolgen. Der erste Schritt ist hier nun zu pr&amp;uuml;fen, ob f&amp;uuml;r dieses Element (&lt;i&gt;item&lt;/i&gt;) noch aktuell ein anderes Intervall l&amp;auml;uft - dieses m&amp;uuml;sste n&amp;auml;mlich dann als erstes beendet werden. Da sich die Aufrufe f&amp;uuml;r die Methode &lt;i&gt;&lt;a href="http://de.selfhtml.org/javascript/objekte/window.htm#clear_interval" accesskey="L" tabindex="0" title="Beschreibung der clearInterval-Methode"&gt; clearInterval&lt;/a&gt;&lt;/i&gt; an mehreren Stellen wiederholen, spendieren wir hierf&amp;uuml;r eine kleine interne Methode, welche &lt;i&gt;clearInterval&lt;/i&gt; aufruft und die bestehende &lt;i&gt;IntervalID&lt;/i&gt; l&amp;ouml;scht. Um im Fall des Umschaltens w&amp;auml;hrend eines laufenden Intervalls immer mit dem jeweils richtigen Wert der H&amp;ouml;he weiter zu arbeiten, speichern wir den aktuellen Wert in einer Eigenschaft auf dem &lt;i&gt;item&lt;/i&gt;-Objekt. Auch verfahren wir mit der &lt;i&gt;IntervalID&lt;/i&gt; gleicherma&amp;szlig;en, indem wir sie &amp;uuml;ber das &lt;i&gt;item&lt;/i&gt;-Objekt speichern - dies versetzt uns in die Lage, bei jedem Methodenaufruf festzustellen, ob f&amp;uuml;r dieses Objekt ein (anderes) Intervall l&amp;auml;uft.&lt;br /&gt; Innerhalb der Intervallmethode pr&amp;uuml;fen wir als erstes, ob die Abbruchbedingung f&amp;uuml;r das Intervall eingetreten, die Endh&amp;ouml;he des Elements erreicht ist. Ist die der Fall, beenden wir das Intervall und setzen das Element auf den urspr&amp;uuml;nglichen Offsetwert der H&amp;ouml;he. Da nun die ganze Zeit mit Pixelwerten in der dynamischen Zuweisung der H&amp;ouml;he gearbeitet wurde, die H&amp;ouml;he aber aufgrund m&amp;ouml;glicher Verschachtelungen mit anderen Elementen dynamisch bleiben muss (vergleiche hierzu das Ergebnis am Ende), setzen wir zu guter Letzt die H&amp;ouml;he auf 100%. &lt;br /&gt; Ist die Abbruchbedingung nicht erreicht, setzen wir die aktuelle H&amp;ouml;he f&amp;uuml;r diesen Aufruf und z&amp;auml;hlen den Wert f&amp;uuml;r die H&amp;ouml;he weiter hoch. &lt;br /&gt; Dieser Wert, der hier hinzuaddiert wird, ist neben der Intervallpause ma&amp;szlig;geblich daf&amp;uuml;r verantwortlich, wie schnell das Element ein- bzw. ausrollt. Merke: je kleiner dieser Wert ausf&amp;auml;llt, desto langsamer der Prozess. Bei der Intervallpause ist das Verh&amp;auml;ltnis genau umgekehrt: je gr&amp;ouml;&amp;szlig;er der Wert, desto langsamer (und abgehackter) ist der Prozess. Tip: der Wert f&amp;uuml;r die Intervallpause sollte den Wert 50 nicht &amp;uuml;berschreiten.&lt;/p&gt; &lt;p&gt; Im Ergebnis erhalten wir nun folgende Methode:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample15" src="/images/javascript/Sample15.png" style="width: 768px; height: 320px" /&gt;&lt;/p&gt; &lt;p class="subTitel"&gt; 3.3. Die scrollIn-Methode &lt;/p&gt; &lt;p&gt; Die Methode &lt;i&gt;_scrollIn&lt;/i&gt; ist analog der Methode &lt;i&gt;_scrollOut&lt;/i&gt; aufgebaut, so dass ich im folgenden nur noch auf die Unterschiede zwischen den Methoden eingehen m&amp;ouml;chte.&lt;/p&gt; &lt;p&gt; Im ersten Schritt setzen wir die &lt;i&gt;scrollOut&lt;/i&gt;-Eigenschaft auf &lt;i&gt;false&lt;/i&gt;. Den Wert f&amp;uuml;r die Starth&amp;ouml;he holen wir uns aus der Eigenschaft &lt;i&gt;currentHeight&lt;/i&gt; des &lt;i&gt;item&lt;/i&gt;-Objektes. Statt einen Wert auf die H&amp;ouml;he hinzuzurechnen, ziehe ich den (gleichen) Wert hier von der jeweils aktuellen H&amp;ouml;he ab.&lt;/p&gt; &lt;p&gt; Am Ende sieht die &lt;i&gt;_scrollIn&lt;/i&gt;-Methode folgenderma&amp;szlig;en aus:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample16" src="/images/javascript/Sample16.png" style="width: 708px; height: 302px" /&gt;&lt;/p&gt; &lt;p&gt; Wenn man bis jetzt alles richtig gemacht hat, erh&amp;auml;lt man folgende Anwendung:&lt;/p&gt; &lt;div class="container w370" onclick="Container.Click(event, false)"&gt; &lt;div class="panel"&gt; Klick hier zum testen... &lt;/div&gt; &lt;div class="content"&gt; &lt;p class="text"&gt; Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.&lt;/p&gt; &lt;p class="text"&gt; In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt; Klickt man auf den grauen Bereich, rollt der darunter liegende Bereich ein bzw. aus.&lt;/p&gt; &lt;p&gt; Aber die oben genannte Aufgabenstellung bestand ja darin ein weiches ein- bzw. ausrollen zu realisieren. Hier kommt also noch hinzu, das Ein- oder Ausblenden in Form eines Fading zu implementieren.&lt;/p&gt; &lt;p class="subTitel"&gt; 3.4. Fading&lt;/p&gt; &lt;p&gt; Um ein weiches Aus- und Einblenden umzusetzen, kommt nur die Style-Eigenschaft &lt;i&gt;&lt;a href="http://www.css4you.de/trickkiste/tr00019.html" accesskey="L" tabindex="0" title="Beschreibung der opacity-Eigenschaft"&gt;opacity&lt;/a&gt;&lt;/i&gt; in Betracht.&lt;/p&gt; &lt;p&gt; An dieser Stelle sto&amp;szlig;en wir wieder auf eine Browserbesonderheit. Der Internet Explorer kann die &lt;i&gt;opacity&lt;/i&gt;-Eigenschaft nicht direkt umsetzen, wie die anderen Browser, das funktioniert hier nur &amp;uuml;ber die &lt;i&gt;&lt;a href="http://de.selfhtml.org/css/eigenschaften/filter.htm" accesskey="L" tabindex="0" title="Beschreibung der filter-Eigenschaft"&gt; filter&lt;/a&gt;&lt;/i&gt;-Eigenschaft.&lt;/p&gt; &lt;p&gt; Beim Setzen der Eigenschaft muss man weiter beachten, dass der Internet Explorer einen Wertebereich von 0 - 100 kennt, die anderen Browser &amp;uuml;ber die Style-Eigenschaft &lt;i&gt;opacity&lt;/i&gt; nur einen Wertebereich von 0 bis 1 verarbeiten k&amp;ouml;nnen.&lt;/p&gt; &lt;p&gt; In der weiteren Planung k&amp;ouml;nnen wir uns ganz auf die obere Vorgehensweise zum Setzen der H&amp;ouml;he verlassen - eigentlich hat sich nur die Eigenschaft (und etwas an der Berechnung) ge&amp;auml;ndert.&lt;/p&gt; &lt;p class="subTitel"&gt; 3.4.1 FadeIn&lt;/p&gt; &lt;p&gt; Die Methode bekommt wieder das DOM-Element &amp;uuml;bergeben. Was an dieser Stelle nicht ben&amp;ouml;tigt wird, ist eine Statuseigenschaft, die Auskunft dar&amp;uuml;ber gibt, ob gerade ein- oder ausgeblendet wird - dazu sp&amp;auml;ter mehr. Somit wird wieder aus dem &lt;i&gt;elements&lt;/i&gt;-Array das aktuelle zum DOM-Element korrespondierende &lt;i&gt;item&lt;/i&gt; abgerufen. Ist das &lt;i&gt;item&lt;/i&gt;-Objekt gefunden, wird auch hier wieder gepr&amp;uuml;ft, ob noch ein Prozess des Ein-/Ausblenden l&amp;auml;uft und ggf. abgebrochen. Der aktuelle &lt;i&gt;opacity&lt;/i&gt;-Wert wird aus dem &lt;i&gt;item&lt;/i&gt;-Objekt ermittelt und der internen Z&amp;auml;hlvariablen zugewiesen. Die Umrechnung und Zuweisung des &lt;i&gt;opacity&lt;/i&gt;-Wertes erfolgt dann in einer internen Hilfsmethode.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample17" src="/images/javascript/Sample17.png" style="width: 714px; height: 140px" /&gt;&lt;/p&gt; &lt;p&gt; Wenn die Eigenschaft &lt;i&gt;filter&lt;/i&gt; unterst&amp;uuml;tzt wird, dann wird der &lt;a href="http://msdn.microsoft.com/en-us/library/ms532967(VS.85).aspx" accesskey="L" tabindex="0" title="Beschreibung der alpha-Eigenschaft"&gt; &lt;i&gt;alpha&lt;/i&gt;-Filter&lt;/a&gt; gesetzt. Bei der Zuweisung des &lt;i&gt;opacity&lt;/i&gt;-Wertes innerhalb des &lt;i&gt;alpha&lt;/i&gt;-Filters wird der &amp;uuml;bergebene Wert einfach mit 100 multipliziert. In allen anderen F&amp;auml;llen wird die &lt;i&gt;opacity&lt;/i&gt;-Style-Eigenschaft direkt gesetzt.&lt;/p&gt; &lt;p&gt; Zu guter Letzt wird wieder gepr&amp;uuml;ft, ob die Abbruchbedingung f&amp;uuml;r das Intervall eingetreten ist - der Wert f&amp;uuml;r &lt;i&gt;opacity&lt;/i&gt; ist gr&amp;ouml;&amp;szlig;er gleich 1. In diesem Fall wird &lt;i&gt;clearInterval&lt;/i&gt; wieder aufgerufen, andernfalls wird der Wert aufaddiert. Hier gilt das gleiche, wie beim Ein-/Ausrollen: je kleiner der Wert, der hinzuaddiert wird, desto langsamer ist der Prozess des Einblenden.&lt;/p&gt; &lt;p&gt; Am Ende erh&amp;auml;lt man dann folgende Methode:&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample18" src="/images/javascript/Sample18.png" style="width: 688px; height: 258px" /&gt;&lt;/p&gt; &lt;p class="subTitel"&gt; 3.4.2 FadeOut&lt;/p&gt; &lt;p&gt; Die &lt;i&gt;_fadeOut&lt;/i&gt;-Methode gestaltet sich analog, nur dass eben kein Wert hinzuaddiert sondern abgezogen wird.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample19" src="/images/javascript/Sample19.png" style="width: 659px; height: 256px" /&gt;&lt;/p&gt; &lt;p&gt; Zum Schluss bleibt die Frage, wie das Ganze im Prozess des Ein-/Ausrollens integriert wird. Ganz einfach: die Methode &lt;i&gt;_scrollIn&lt;/i&gt; bzw. &lt;i&gt;_scrollOut&lt;/i&gt; wird jeweils um die Methode &lt;i&gt;_fadeOut&lt;/i&gt; bzw &lt;i&gt;_fadeIn&lt;/i&gt; erweitert, und zwar genau an der Stelle, nachdem gepr&amp;uuml;ft wurde, ob die &lt;i&gt;item.scroll&lt;/i&gt;-Eigenschaft noch gesetzt ist.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample20" src="/images/javascript/Sample20.png" style="width: 698px; height: 70px" /&gt;&lt;/p&gt; &lt;p&gt; bzw.&lt;/p&gt; &lt;p&gt; &lt;img alt="Sample21" src="/images/javascript/Sample21.png" style="width: 701px; height: 69px" /&gt;&lt;/p&gt; &lt;p&gt; Da wir innerhalb der &lt;i&gt;_scrollIn&lt;/i&gt; bzw. &lt;i&gt;_scrollOut&lt;/i&gt; Methoden schon mit einer Statuseigenschaft arbeiten, ben&amp;ouml;tigen wir f&amp;uuml;r den Prozess des Fading keine weitere Statuseigenschaft. Dies ist nur erforderlich, wenn das Fading eigenst&amp;auml;ndig aufgerufen werden sollte. Dann kann man hier analog zur Statuseigenschaft &lt;i&gt;scrollOut&lt;/i&gt; verfahren. &lt;/p&gt; &lt;p&gt; Hat man alles richtig gemacht, erh&amp;auml;lt man folgende fertige L&amp;ouml;sung:&lt;/p&gt; &lt;div id="container1" class="container w370" onclick="Container.Click(event, true)"&gt; &lt;div id="panel1" class="panel"&gt; [1] Klicke hier, um zu testen...&lt;/div&gt; &lt;div id="content1" class="contentBase"&gt; &lt;p class="text"&gt; Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.&lt;/p&gt; &lt;p class="text"&gt; In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.&lt;/p&gt; &lt;hr /&gt; &lt;div id="container2" class="container" onclick="Container.Click(event, true)"&gt; &lt;div id="panel2" class="panel"&gt; [2] Klicke hier, um zu testen...&lt;/div&gt; &lt;div id="content2" class="content"&gt; &lt;p class="text"&gt; Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.&lt;/p&gt; &lt;p class="text"&gt; In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus.&lt;/p&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;p&gt; Im Ergebnis sollte die Erkenntnis gekommen sein, dass Javascript kein Teufelszeug ist, vor dem man Angst haben muss. Der Einsatz von Javascript in seinen Webanwendungen setzt nur folgendes voraus: Kenntnis vom Aufbau des DOM, Kenntnisse von Css-Eigenschaften und was diese bewirken und letztlich das Wissen, dass man auch mal eine g&amp;auml;ngige Suchmaschine benutzen sollte, wenn man doch nicht alles sofort parat hat. Auch wenn ich mich erneut wiederhole, doch kann man es nicht oft genug sagen: eine aus meiner Sicht nahezu unverzichtbare Quelle als Nachschlagewerk stellt &lt;i&gt;&lt;a href="http://de.selfhtml.org" accesskey="L" tabindex="0" title="zur Seite: de.selfhtml.org"&gt; selfHTML&lt;/a&gt;&lt;/i&gt; dar. Dessen sollte man sich immer bewusst sein. Und da bedarf es keiner exorbitanten Budgets oder Herrscharen von Javascriptentwicklern. Man muss einfach bereit sein, sich mit diesem Sprachelement auch ernsthaft auseinander zu setzen. Dies gilt aber auch dann, wenn man sich f&amp;uuml;r ein Javascript-Framework wie z.B. &lt;a href="http://www.jquery.com" accesskey="L" tabindex="0" title="zur Seite: www.jquery.com"&gt;jQuery&lt;/a&gt; entscheidet.&lt;/p&gt; </description><link>http://weblog.drescher-hackel.de/147DCE60-7A67-4A8D-B520-F7FC44438924/Keine+Angst+vor+Javascript.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Tue, 13 Oct 2009 13:43:01 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.8555FDB3-384B-47F9-AAF4-05316B59C57A.content.aspx</guid><title>Bug oder Feature - DataBinding der CheckBoxList</title><description> &lt;p&gt; Im Rahmen meiner beruflichen T&amp;auml;tigkeit war es wieder mal so weit, sich mit der Entwicklung von Custom Controls n&amp;auml;her auseinander zu setzen. Custom Controls bieten dabei aus meiner Sicht einen unsch&amp;auml;tzbaren Vorteil: &amp;uuml;ber das Control kann man allen Benutzern des selben so klare Vorgaben machen, dass das Endergebnis im Webprojekt auch wirklich immer gleich aussieht. So kann man &amp;quot;frecherweise&amp;quot; bestimmte Eigenschaften so setzen, dass sie bewu&amp;szlig;t &amp;uuml;berschrieben werden. Aber das soll heute nicht das eigentliche Thema sein.&lt;/p&gt; &lt;p&gt; Bei der Planung des Custom Control - und wer immer sich damit besch&amp;auml;ftigen will - ist es stets hilfreich, sich doch einmal mit den Grundlagen der Controlentwicklung zu besch&amp;auml;ftigen. Einen etwas &amp;auml;lteren - aber immer noch aktuellen - Ansatz bietet hierbei der &lt;a href="http://www.microsoft.com/germany/msdn/webcasts/serien/MSDNWCS-0608-02.mspx" accesskey="L" tabindex="0" title="Zur Webcastserie von Daniel Walzenbach"&gt;Webcast von Daniel Walzenbach&lt;/a&gt;. Um es an dieser Stelle gleich vorweg zu nehmen, es bleibt vieles in der Webcastserie an der Oberfl&amp;auml;che und beschr&amp;auml;nkt sich i.d.R. auf diverse Samples, welche man auch in der MSDN-Sammlung wiederfindet. Dennoch ist diese Webcastserie meines Erachtens unverzichtbar beim Einstieg in die Controlentwicklung.&lt;/p&gt; &lt;p&gt; Wer schon mal die Controls von &lt;a href="http://www.infragistics.com/dotnet/netadvantage/aspnet.aspx#Overview" accesskey="L" tabindex="0" title="Zur Seite von Infragistics"&gt;Infragistics&lt;/a&gt; oder vom &lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Tabs/Tabs.aspx" accesskey="L" tabindex="0" title="Zur Seite vom AjaxToolkit"&gt;AjaxToolkit&lt;/a&gt; eingesetzt hat, dem d&amp;uuml;rften diverse verschachtelte Controls aufgefallen sein. Daniel Walzenbach erkl&amp;auml;rt in seiner Webcastserie sehr ausf&amp;uuml;hrlich, wie man dieses Verhalten umsetzen kann. Am Ende werden zu den Properties bestimmte Attribute gesetzt.&lt;/p&gt; &lt;p&gt; &lt;img alt="PropertyAttribute" src="/images/customcontrol/property.png" style="width: 582px; height: 137px" /&gt;&lt;/p&gt; &lt;p&gt; Vor diesem Hintergrund kam mir der Gedanke: warum soll ich alles von Hand implementieren, wenn ich doch gleich ein .NET-Webcontrol als Nested-Control verwenden kann. Was mit einer Property vom Type Style geht, sollte auch mit einer TextBox oder einer CheckBoxList funktionieren.&lt;/p&gt; &lt;p&gt; Und in der Tat - es funktioniert. Somit konnte ich mir sehr viel Arbeit ersparen (welche Daniel Walzenbach im Webcast noch f&amp;uuml;r zwingend erforderlich hielt). &lt;/p&gt; &lt;p&gt; Nun waren noch die Punkte des Postback-Verhalten und der Datenbindung zu kl&amp;auml;ren. Man m&amp;ouml;chte nun meinen, dass die Standardwebcontrols alles implementiert haben? Ja und nein - den IPostBackDataHandler muss man trotzdem im Custom Control implementieren. Was man aber nicht mehr ben&amp;ouml;tigt, ist die detailierte Vorgehensweise, wie sie vom Daniel im Webcast beschrieben wurde - zumindest nicht, soweit es die Standardwebcontrols betrifft. Hier gen&amp;uuml;gt es in der LoadPostData-Methode den Wert true zur&amp;uuml;ck zu geben. &lt;/p&gt; &lt;p&gt; &lt;img alt="LoadPostDataDefault" src="/images/customcontrol/loadpostdata1.png" style="width: 571px; height: 207px" /&gt;&lt;/p&gt; &lt;p&gt; F&amp;uuml;r alle anderen F&amp;auml;lle bleibt es dabei, dass die Werte verglichen werden m&amp;uuml;ssen.(siehe unten)&lt;/p&gt; &lt;p&gt; Ein weiterer Punkt ist die Datenbindung. Hier bin ich fast verzweifelt. Am Ende stellte sich die Frage, wieso gibt es hierf&amp;uuml;r keine vern&amp;uuml;nftige Implementierung im .NET-Framework? Doch was ist geschehen: Nehme ich ein List-Steuerelement, w.z.B. eine CheckBoxList und binde sie an eine Datenquelle, dann passiert das i.d.R. folgenderma&amp;szlig;en:&lt;/p&gt; &lt;p&gt; &lt;img alt="DataBinding" src="/images/customcontrol/databindcbl.png" style="width: 562px; height: 156px" /&gt;&lt;/p&gt; &lt;p&gt; Man m&amp;ouml;chte meinen, dass der Checked-Status der einzelnen Elemente aus der Datenquelle &amp;uuml;bernommen wird. Aber weit gefehlt. Erstaunlicherweise hatte sich &lt;a href="http://www.aspnetzone.de/blogs/peterbucher/archive/2007/09/03/eintraege-der-checkboxlist-beim-databinding-vorselektieren.aspx" accesskey="L" tabindex="0" title="Zur Seite von Peter Bucher"&gt;Peter Bucher mit diesem Thema&lt;/a&gt; schon einmal auseinander gesetzt und es scheint mir die derzeit plausibelste Vorgehensweise f&amp;uuml;r dieses Problem.&lt;/p&gt; &lt;p&gt; Im Rahmen der Custom Control Entwicklung wollte ich jetzt nicht noch ein Custom Control ins Spiel bringen, zu mal ich ja direkten Einfluss auf den Renderprozess des Controls (der CheckBoxList) habe. Folglich habe ich mich f&amp;uuml;r einen anderen Weg entschieden - der z.T. durch das Projekt mit bedingt war.&lt;/p&gt; &lt;p&gt; Das Rendern der CheckBoxList habe ich selbst &amp;uuml;bernommen und so direkten Einfluss auf die Eigenschaften der einzelnen CheckBox genommen. Orientiert habe ich mich am Renderprozess des CheckBoxList-Control selbst.&lt;/p&gt; &lt;p&gt; Um den Checked-Status der CheckBoxen richtig setzen zu k&amp;ouml;nnen, habe ich dem Custom Control eine Property zugewiesen, welche die einzelnen Werte separiert verwaltet, zuz&amp;uuml;glich einer Eigenschaft f&amp;uuml;r den Delimiter.&lt;/p&gt; &lt;p&gt; &lt;img alt="RenderControl" src="/images/customcontrol/rendercontrol.png" style="width: 674px; height: 782px" /&gt;&lt;/p&gt; &lt;p&gt; Zu guter Letzt musste ich mich nur noch um den PostBack k&amp;uuml;mmern. Hierzu habe ich dann in der LoadPostData-Methode folgende Codezeilen eingef&amp;uuml;gt:&lt;/p&gt; &lt;p&gt; &lt;img alt="LoadPostDataSpezial" src="/images/customcontrol/loadpostdata2.png" style="width: 744px; height: 343px" /&gt;&lt;/p&gt; &lt;p&gt; Analog ist dann auch die Vorgehensweise beim DropDownList-Control, wenn denn die Mehrfachauswahl zugelassen ist.&lt;/p&gt; &lt;p&gt; Es bleibt aber zu hoffen, dass dieses Manko - und das ist es in der Tat - in eine der n&amp;auml;chsten Versionen allgemeing&amp;uuml;ltig behoben ist.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/8555FDB3-384B-47F9-AAF4-05316B59C57A/Bug+oder+Feature+-+DataBinding+der+CheckBoxList.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 13 Sep 2009 14:14:59 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.8FE24D67-434B-4231-B446-06CD8AD1276E.content.aspx</guid><title>Datengebundene Webanwendungen mit AJAX.PRO</title><description> &lt;div style="height: 496px"&gt; &lt;p style="display:none"&gt;D37DUDTU3NH8&lt;/p&gt;&lt;p style="float: left; width: 278px;"&gt; Immer wieder lese ich im Netz, dass Anwender sich schwer damit tun, AJAX.PRO in ihren Projekten einzusetzen. Dabei ist der Einstieg aus meiner Sicht bald noch einfacher, als wenn man das Ajax-Toolkit einsetzen m&amp;ouml;chte. Was braucht es dazu? Zum einem reicht es aus, wenn man der englischen Sprache m&amp;auml;chtig ist, denn Michael Schwarz hat es zielgruppenorientiert eigentlich sehr gut auf &lt;a href="http://www.ajaxpro.info" accesskey="L" tabindex="0" title="zur Seite von ajaxpro.info"&gt;seinen Webseiten&lt;/a&gt; dokumentiert. &lt;br /&gt; &lt;br /&gt; Wer dem Englischen nicht so zugewandt ist, dem ist es ja freigestellt den nachfolgenden Ausf&amp;uuml;hrungen zu folgen. &lt;br /&gt; &lt;br /&gt;  &lt;a style="font-weight: bold;"&gt;1. Voraussetzungen &lt;/a&gt; &lt;br /&gt; &lt;br /&gt; Als erstes sollte man sich die Ajax.Pro-Bibliothek aus dem Netz beschaffen. Diese ist mit und ohne Quellcode unter dem Portal &lt;a href="http://ajaxpro.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=23363" accesskey="L" tabindex="0" title="zur Seite von codeplex"&gt;codeplex hinterlegt und abrufbar&lt;/a&gt;. Hierbei sollte man wissen, dass die Weiterentwicklung durch Michael Schwarz abgeschlossen ist. Es steht jedoch jedem frei, die Bibliothek unter der Ma&amp;szlig;gabe der Lizenzvereinbarung weiter zu entwickeln. Nach dem Entpacken der Zip-Datei erh&amp;auml;lt man einen Ordner mit 4 verschiedenen Assemblies und einer Beispiel-web.config-Datei. &lt;/p&gt; &lt;img alt="Ajaxpro Download" src="/images/ajaxpro/download.png" style="width: 430px; float: right; margin: 5px; height: 475px; margin: 5px;" /&gt; &lt;/div&gt; &lt;div style="overflow:hidden;"&gt; &lt;p&gt; Der n&amp;auml;chste Schritt ist dann die Einbindung in das eigene Webprojekt - dazu sollte eine Referenz auf eine Ajax.Pro-Bibliothek gesetzt werden. &amp;nbsp; &lt;/p&gt; &lt;img alt="AjaxPro Reference" src="/images/ajaxpro/addreference.png" style="width: 271px; height: 205px;" /&gt; &lt;img alt="AjaxPro Reference" src="/images/ajaxpro/addreference2.png" style="width: 514px; height: 438px" /&gt; &lt;p&gt; Im Webprojekt wählt man dazu &amp;uuml;ber das Contextmen&amp;uuml; auf dem Knoten &lt;i&gt;Reference&lt;/i&gt; den Eintrag &lt;i&gt;Add Reference&lt;/i&gt;, so dass sich dann das Dialogfenster &amp;ouml;ffnet.&lt;/p&gt; &lt;img alt="dll" src="/images/ajaxpro/ajaxpro_dlls.png" style="width: 484px; float: left; margin: 5px; height: 273px" /&gt; &lt;p&gt; &amp;Uuml;ber den Register &lt;i&gt;Browse&lt;/i&gt; navigiert man zu dem Verzeichnis, in dem man zuvor die Zip-Datei entpackt hat. F&amp;uuml;r eine .NET 1.x - Anwendung w&amp;auml;hlt man die &lt;i&gt;AjaxPro.dll&lt;/i&gt; aus f&amp;uuml;r alle anderen (also .NET 2.0 aufw&amp;auml;rts) die &lt;i&gt;AjaxPro.2.dll&lt;/i&gt;.&lt;/p&gt; &lt;p&gt; Hat man alles richtig gemacht, erscheint die Referenz unterhalb des Referenz-Knotens.&lt;img alt="AjaxPro Reference" src="/images/ajaxpro/addreference3.png" style="width: 226px; float: left; margin: 5px; height: 130px" /&gt;&lt;/p&gt; &lt;/div&gt; &lt;div style="height: 400px"&gt; &lt;p&gt; Weiter muss die &lt;i&gt;web.config&lt;/i&gt;-Datei erweitert werden, indem ein Http-Handler im &lt;i&gt;system.web&lt;/i&gt;-Knoten hinzugef&amp;uuml;gt werden muss.&lt;/p&gt; &lt;p&gt; &lt;img alt="webconfig" src="/images/ajaxpro/webconfig_handler2.png" style="width: 760px; height: 160px" /&gt;&lt;br /&gt; &lt;img alt="webconfig" src="/images/ajaxpro/webconfig_handler3.png" style="width: 536px; height: 133px" /&gt;&lt;/p&gt; &lt;p&gt; Dabei gilt es zu beachten, dass &lt;i&gt;AjaxPro.2&lt;/i&gt; nur dann anzugeben ist, wenn auch die entsprechende Assembly dazu eingebunden ist. Orientieren kann man sich hier sehr sch&amp;ouml;n am Eintrag unterhalb des Knoten Reference.&lt;/p&gt; &lt;/div&gt; &lt;div&gt; &lt;p&gt; Der n&amp;auml;chste Schritt gilt der eigentlichen Client-Server-Kommunikation. In meiner praktischen Anwendung von Ajax.Pro hat es sich &amp;uuml;ber die Jahre bew&amp;auml;hrt, hierf&amp;uuml;r dem Projekt eine separate Klasse hinzuzuf&amp;uuml;gen. Dies hat vor allem den Vorteil, dass man alle Ajax-Server-Methoden zentral an einem Ort hat. Die Ajax-Methoden m&amp;uuml;ssen dabei mit einem gesonderten Attribute versehen werden, so dass sp&amp;auml;ter klar ist, welche Methoden am Client verf&amp;uuml;gbar sein sollen. Der Klasse selbst kann man ebenfalls ein Attribut zuordnen, um so z.B. komplexere Namespaces k&amp;uuml;rzer zu fassen oder die Serverarchitektur am Client nicht v&amp;ouml;llig offen zu legen. Hilfreich ist weiterhin, &amp;uuml;ber die &lt;i&gt;using&lt;/i&gt;-Anweisung den AjaxPro-Namespace der Klasse hinzuzuf&amp;uuml;gen.&lt;/p&gt; &lt;p&gt; &lt;img alt="namespace" src="/images/ajaxpro/ajaxpronamespace.png" style="width: 382px; height: 292px" /&gt;&lt;img alt="namespace2" src="/images/ajaxpro/ajaxpronamespace2.png" style="width: 443px; height: 292px" /&gt;&lt;/p&gt; &lt;p&gt; Der letzte Schritt ist dann die &lt;i&gt;Registrierung&lt;/i&gt; der AjaxPro-Klasse f&amp;uuml;r die eigentliche Verwendung am Client. Mit dieser Registrierung werden Javascriptobjekte erzeugt und in die Seite mit eigebunden, die es dem Anwender erst erm&amp;ouml;glichen mit dem Server via Ajax.Pro(Javascript) zu kommunizieren. F&amp;uuml;r die Registrierung ist im &lt;i&gt;Page_Load&lt;/i&gt;-Eventhandler der Seite der folgende Eintrag erforderlich: &lt;/p&gt; &lt;p&gt; &lt;img alt="registrierung" src="/images/ajaxpro/ajaxpronamespace3.png" style="width: 701px; height: 179px" /&gt; &lt;/p&gt; &lt;p&gt; Der zweite Parameter in der Methode &lt;i&gt;RegisterTypeForAjax&lt;/i&gt; ist optional, wobei es sich in der Praxis bew&amp;auml;hrt hat, ihn mit anzugeben. Bei der Verwendung von Masterpages erfolgt die Registrierung i.d.R. im &lt;i&gt;Page_Load&lt;/i&gt;-Eventhandler der Masterpage.&lt;/p&gt; &lt;p&gt; Auf der Serverseite haben wir nun alle Voraussetzungen geschaffen, um auf der Anwendungsseite eine AJAX-Anwendung umsetzen zu k&amp;ouml;nnen. &lt;/p&gt; &lt;/div&gt; &lt;p style="font-weight: bold;"&gt; 2. Anwendung&lt;/p&gt; &lt;p&gt; Wenden wir uns nun der clientseitigen Implementierung zu. Einer der vielen Vorteile von Ajax.Pro besteht darin, dass die eigentliche Lernkurve sehr gering ausf&amp;auml;llt - das, was man in den serverseitigen Aufbau investiert hat, kann man eins zu eins auf der Clientseite wiederfinden. Die folgende Grafik soll dies verdeutlichen. &lt;/p&gt; &lt;p&gt; &lt;img alt="GetBenutzer" src="/images/ajaxpro/AjaxPro_GetBenutzer.png" style="width: 733px; height: 407px" /&gt; &lt;/p&gt; &lt;p&gt; Auf der Serverseite wurde in dem Beispiel der Namespace auf &lt;i&gt;Web.Server&lt;/i&gt; festgelegt (lila Markierung). Im Watchfenster kann man sehen, dass genau diese Objektstruktur am Client vorhanden ist. Die Ajaxmethode (gr&amp;uuml;ne Markierung) ist ebenfalls unter gleichen Namen am Client wiederzufinden. Ein Blick auf den R&amp;uuml;ckgabetype der Ajaxmethode (orange Markierung) offenbart einen weiteren Vorteil von Ajax.Pro: man kann nahezu fast jedes .NET Objekt als R&amp;uuml;ckgabetype angeben. Ajax.Pro seriealisert diesen zum Client (und auch vom Client zum Server, wie weiter unten zu sehen), ohne dass man eine Zeile extra Code hierzu zu schreiben hat. Der Aufruf der Servermethode vom Client aus liefert immer ein &lt;i&gt;Resultobjekt&lt;/i&gt; zur&amp;uuml;ck. Die zwei wichtigsten Eigenschaften des &lt;i&gt;Resultobjekt&lt;/i&gt;es sind das &lt;i&gt;error&lt;/i&gt;-Objekt und das &lt;i&gt;value&lt;/i&gt;-Objekt. War der Aufruf am Server erfolgreich, also fehlerfrei, so ist das &lt;i&gt;error&lt;/i&gt;-Objekt immer null. Das &lt;i&gt;value&lt;/i&gt;-Objekt beinhaltet immer den R&amp;uuml;ckgabetyp der Servermethode. In der Grafik oben kann man sehr sch&amp;ouml;n erkennen (orange Markierung), dass im Wege der Serialisierung die Eigenschaften des Objektes auch auf der Clientseite zur Verf&amp;uuml;gung stehen. Mit diesem Wissen ist man in der Lage, Ajax-Anwendungen zu erstellen, ohne dass es z.B. eines Updatepanels bedarf. Mit Ajax.Pro konzentriert sich der Entwickler auf das wesentliche einer Ajax-Anwendung, dem Datentransfer.&lt;/p&gt; &lt;p&gt; Ich habe zum besseren Verst&amp;auml;ndnis ein kleines Beispielprojekt erstellt, in dem es darum geht, Daten aus einer Datenquelle auszulesen, am Client anzuzeigen, zu bearbeiten, Daten zu l&amp;ouml;schen und neue Daten hinzuzuf&amp;uuml;gen. Im Wesentlichen sind dies die Standardaufgaben bei datengebundenen Webanwendungen - man m&amp;ouml;chte Daten lesen, bearbeiten, hinzuf&amp;uuml;gen oder l&amp;ouml;schen. Wie einfach das ganze mit Ajax.Pro geht, m&amp;ouml;chte ich an Hand dieser Beispielsanwendung demonstrieren.&lt;/p&gt; &lt;p style="font-weight: 200; font-style: italic; text-decoration: underline;"&gt; 2.1 Die Datenquelle&lt;/p&gt; &lt;p&gt; Als Datenquelle habe ich eine einfache XML-Datei gew&amp;auml;hlt, wobei sich das Beispiel auch auf jede andere Datenquelle &amp;uuml;bertragen l&amp;auml;sst. Der Aufbau der XML-Datei ist recht einfach gehalten: es gibt n-Benutzer Elemente, wobei jedes Benutzer-Element ein Attribute &lt;i&gt;id&lt;/i&gt; besitzt und zwei weitere Childnodes, f&amp;uuml;r &lt;i&gt;Vorname&lt;/i&gt; und &lt;i&gt;Nachname&lt;/i&gt;. &amp;uuml;ber das mit dem &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=fe6f2099-b7b4-4f47-a244-c96d69c35dec&amp;amp;displaylang=en" tabindex="0" accesskey="L" title="zur Downloadseite von Microsoft"&gt;.NET SDK&lt;/a&gt; bereitgestellte Tool &lt;i&gt;xsd.exe&lt;/i&gt; habe ich noch eine passende .NET Klasse erzeugt. Wie sich die Klasse verwenden l&amp;auml;sst, weiter unten im Text dann.&lt;/p&gt; &lt;p style="font-weight: 200; font-style: italic; text-decoration: underline;"&gt; 2.2 Das Javascript&lt;/p&gt; &lt;p&gt; Immer wieder lese ich in den Foren, dass Webentwickler zwar eine Ajax-Anwendung umsetzen m&amp;ouml;chten, Javascript aber auf der anderen Seite m&amp;ouml;glichst vermieden wird. Doch das &lt;i style="text-decoration: underline;"&gt;JA&lt;/i&gt; im Wort A&lt;a style="text-decoration:underline;"&gt;JA&lt;/a&gt;X steht f&amp;uuml;r Javascript. Wie sieht die Implementierung f&amp;uuml;r Ajax.Pro aus. Kommen wir noch mal zur&amp;uuml;ck zu der vorangegangenen Grafik: der Namespace in der Ajax.Pro-Klasse findet sich auch auf der Clientseite wieder, ebenso wie die Methodennamen der Ajax-Methoden. Der Abruf einer Liste von Benutzern aus der Xml-Datenquelle sollte dann folgenderma&amp;szlig;en aussehen:&lt;/p&gt; &lt;p&gt; &lt;img alt="client1" src="/images/ajaxpro/client1.png" style="width: 718px; height: 400px" /&gt;&lt;/p&gt; &lt;p&gt; &amp;Uuml;ber den onload-Eventhandler rufe ich die Methode &lt;i&gt;GetBenutzerListe&lt;/i&gt; auf. Innerhalb dieser Methode findet die eigentliche Kommunikation mit dem Server statt, indem die Servermethode &amp;uuml;ber &lt;i&gt;Web.Server.GetBenutzerListe&lt;/i&gt; aufgerufen wird. Der Aufruf an sich gibt ein &lt;i&gt;Resultobjekt&lt;/i&gt; zur&amp;uuml;ck. W&amp;uuml;rde man so verfahren, dann h&amp;auml;tten wir einen &lt;i style="text-decoration: underline;"&gt;synchronen&lt;/i&gt; Serveraufruf. Damit der Aufruf letztendlich &lt;i&gt;asynchron&lt;/i&gt; erfolgt, wird der Servermethode einfach der &lt;i&gt;Callbackhandler&lt;/i&gt; mitgegeben. Der &lt;i&gt;Callbackhandler&lt;/i&gt; ist dabei kein Methodenparameter im eigentlichen Sinne, sondern eine weitere Javascriptmethode. Diese wird immer dann aufgerufen, sobald die Kommunikation mit dem Server abgeschlossen ist. Das &lt;i&gt;Resultobjekt&lt;/i&gt; ist dabei ein Methodenparameter des &lt;i&gt;Callbackhandlers&lt;/i&gt;.&lt;/p&gt; &lt;p&gt; Das &lt;i&gt;Resultobjekt&lt;/i&gt; hat wiederum weitere Eigenschaften, wobei die zun&amp;auml;chst zwei wichtigsten das &lt;i&gt;error&lt;/i&gt;-Objekt und das &lt;i&gt;value&lt;/i&gt;-Objekt sind. Das &lt;i&gt;error&lt;/i&gt;-Objekt sollte immer vorab auf &lt;i&gt;null&lt;/i&gt; gepr&amp;uuml;ft werden, bevor mit der eigentlichen Verarbeitung des R&amp;uuml;ckgabewertes begonnen wird. Wird ein konkretes Objekt in der R&amp;uuml;ckgabe erwartet, so hat es sich in der bisherigen Praxis bew&amp;auml;hrt, zus&amp;auml;tzlich das &lt;i&gt;value&lt;/i&gt;-Objekt ebenfalls auf &lt;i&gt;null&lt;/i&gt; zu pr&amp;uuml;fen. Ist das &lt;i&gt;error&lt;/i&gt;-Objekt nicht &lt;i&gt;null&lt;/i&gt;, so sollte man sich Szenarien &amp;uuml;berlegen, wie man mit der weiteren Fehlerbehandlung am Client verf&amp;auml;hrt. Die &lt;i&gt;Message&lt;/i&gt;-Eigenschaft des &lt;i&gt;error&lt;/i&gt;-Objektes beinhaltet eine deatilierte Fehlermeldung, die der Exceptionmessage entspricht. Es ist selten zu empfehlen, die Fehlermeldung am Client direkt auszugeben - das sollte man sich gr&amp;uuml;ndlich &amp;uuml;berlegen.&lt;/p&gt; &lt;p&gt; In dem Beispiel wird eine Dropdownliste mit den vorhandenen Benutzern erstellt. Der Aufbau der Dropdownliste orientiert sich an allgemeinen Javascriptgrundlagen, wobei &lt;a href="http://de.selfhtml.org" accesskey="L" tabindex="0" title="zur Seite von SELFHTML"&gt; SELFHTML&lt;/a&gt; stets eine gute Quelle zum Nachschlagen bietet.&lt;/p&gt; &lt;p&gt; Nun, ich muss zugeben, bis hierher gab es noch keinen wirklichen Grund, f&amp;uuml;r den Einsatz von Ajax.Pro, denn eine Dropdownliste kann man auch serverseitig an eine Datenquelle binden. Aber ich habe ja Eingangs geschrieben, dass ich zeigen m&amp;ouml;chte, wie man mit Ajax.Pro Daten anzeigen und bearbeiten kann. &lt;/p&gt; &lt;p&gt; Um nun die Benutzerdaten der Dropdownliste zu bearbeiten, versehen wir diese mit einem onchange-Eventhandler, der daf&amp;uuml;r Sorge tragen wird, dass das Miniformular &lt;/p&gt; &lt;p&gt; &lt;img alt="form" src="/images/ajaxpro/formular1.png" style="width: 357px; height: 164px" /&gt;&lt;/p&gt; &lt;p&gt; mit den entsprechenden Daten versehen wird. Auch hier k&amp;ouml;nnte man den Einwand erheben, dass ja die Daten schon in der Dropdownliste vorhanden sind, doch soll hier mit diesem Beispiel die einfache Kommunikation mit dem Server demonstriert werden. Der Eventhandler der Dropdownliste f&amp;uuml;hrt dabei folgenden Code aus:&lt;/p&gt; &lt;p&gt; &lt;img alt="onchange" src="/images/ajaxpro/client3_onchange.png" style="width: 712px; height: 600px" /&gt;&lt;/p&gt; &lt;p&gt; Der onchange-Eventhandler ist hier die Javascriptmethode &lt;i&gt;GetBenutzer&lt;/i&gt;. &amp;uuml;ber &lt;i&gt;Web.Server.GetBenutzer&lt;/i&gt; (gr&amp;uuml;ne Markierung) wird der Server aufgerufen. Als Parameter wird die &lt;i&gt;ID&lt;/i&gt; des Benutzers erwartet (rote Markierung). Die Ajax-Methode &lt;i&gt;GetBenutzer&lt;/i&gt; gibt dabei ein Objekt vom Type &lt;i&gt;Benutzer&lt;/i&gt; an den Client zur&amp;uuml;ck (pinkfarbene Markierung). Im Javascript wird wieder ein &lt;i&gt;Callbackhandler&lt;/i&gt; (blaue Markierung) mit angegeben, der wieder aufgerufen wird, wenn der Server mit der Verarbeitung der Anfrage fertig ist. Auf der Serverseite wird die XML-Datenquelle geladen und genau das Element gesucht, das im &lt;i&gt;id&lt;/i&gt;-Attribute-Wert dem &amp;uuml;bergebenen String entspricht. Hier habe ich die Benutzerklasse so gestaltet, dass wenn kein Benutzer in der Datenquelle gefunden wurde (weil z.B. ein anderer Anwender diesen zwischenzeitlich gel&amp;ouml;scht hat), immer ein leeres Benutzerobjekt mit einer neuen Guid in der &lt;i&gt;ID&lt;/i&gt;-Eigenschaft zur&amp;uuml;ckgegeben wird. Diesen Umstand werden wir sp&amp;auml;ter noch gut zu verwenden wissen. Schaut man sich das Ganze mal in Ruhe an, so stellt man fest, dass immer der gleiche Ablauf erfolgt: der Client ruft den Server, der Server verarbeitet Daten und gibt eine bestimmte Information wieder an den Client zur&amp;uuml;ck. Die gesamte Logik liegt dabei ausschlie&amp;szlig;lich am Server. Was aber auch auff&amp;auml;llt ist wieder das, was Ajax.Pro ausmacht: es wird kein Page-Lifecycle durchlaufen, sondern es werden nur die reinen Daten zwischen Client und Server ausgetauscht - ganz ohne Updatepanel.&lt;/p&gt; &lt;p&gt; Nachdem ich nun die Daten in das Formular geladen habe,&lt;/p&gt; &lt;p&gt; &lt;img alt="client2" src="/images/ajaxpro/client2.png" style="width: 656px; height: 283px" /&gt;&lt;/p&gt; &lt;p&gt; m&amp;ouml;chte ich sie auch ver&amp;auml;ndern und am Server wieder abspeichern k&amp;ouml;nnen. Dazu erweitere ich das Formular um einen Button, der die Speicherfunktion &amp;uuml;ber den onclick-Eventhandler aufruft.&amp;nbsp; Die o.g. Javascriptmethode &lt;i&gt;WriteBenutzer&lt;/i&gt; habe ich inzwischen erweitert, um mir den aktuell ausgew&amp;auml;hlten Benutzer am Client zwischenzuspeichern, denn wie ich Eingangs sch&amp;ouml;n erw&amp;auml;hnte, kann ich mit Ajax.Pro .NET Objekte zwischen dem Server und dem Client in beiden Richtungen austauschen - diesen Umstand m&amp;ouml;chte ich beim Speichern des Benutzerobjektes gerne nutzen. Schauen wir uns den Code einmal an:&lt;/p&gt; &lt;p&gt; &lt;img alt="saveBenutzer" src="/images/ajaxpro/client4_save.png" style="width: 720px; height: 600px" /&gt;&lt;/p&gt; &lt;p&gt; Inherhalb der Javascriptmethode &lt;i&gt;SaveBenutzer&lt;/i&gt; &amp;uuml;bertrage ich die Formulardaten in das aktuelle Benutzerobjekt &lt;i&gt;currentBenutzer&lt;/i&gt;. Im Anschluss wird die Ajaxmethode &lt;i&gt;SaveBenutzer&lt;/i&gt; (rote Markierung) aufgerufen und das aktuelle (ver&amp;auml;nderte) Benutzerobjekt als Parameter (orange Markierung) mit &amp;uuml;bergeben. Ohne das es jetzt einer zus&amp;auml;tzlichen Zeile Code bedarf, ist sofort eine Instanz der Klasse Benutzer mit den entsprechenden Daten am Server verf&amp;uuml;gbar. Somit braucht man nur noch die &lt;i&gt;Save&lt;/i&gt;-Methode der Klasse &lt;i&gt;Benutzer&lt;/i&gt; (blaue Markierung) aufrufen. An dieser Stelle k&amp;ouml;nnte man jetzt die Werte noch validieren, wobei auch hier Ajax.Pro mir einen kleinen Teil der Validierung abnimmt: immer wenn die Wertzuweisungen vom Typ sich nicht &amp;uuml;bertragen lassen, wird eine Exception ausgel&amp;ouml;st, was zu Folge hat, dass das &lt;i&gt;error&lt;/i&gt;-Objekt im &lt;i&gt;Resultobjekt&lt;/i&gt; nicht mehr &lt;i&gt;null&lt;/i&gt; ist - die Anwendung auf der Clientseite bleibt nahezu unbetroffen; es bleibt Aufgabe des Entwicklers, das &lt;i&gt;error&lt;/i&gt;-Objekt sinnvoll auszuwerten. Hat die &lt;i&gt;Save&lt;/i&gt;-Methode der Benutzerklasse &lt;i&gt;true&lt;/i&gt; zur&amp;uuml;ckgegeben, so gibt die Ajaxmethode die aktuelle (ver&amp;auml;nderte) Liste an den Client zur&amp;uuml;ck. Als &lt;i&gt;Callbackhandler&lt;/i&gt; (lila Markierung) wurde &lt;i&gt;WriteBenutzerListe&lt;/i&gt; angeben, mit der Folge, dass die Dropdownliste am Client sofort aktualisiert wird. Und wieder hat Ajax.Pro sich auf das Wesentliche beschr&amp;auml;nkt - dem reinen Datentransfer. Interessant ist in diesem Zusammenhang die Betrachtung, wenn statt der Liste &lt;i&gt;null&lt;/i&gt; am Client ankommt - in diesem Fall wird die Dropdownliste nicht aktualisiert und am Client wird die Meldung ausgegeben, dass das Speichern fehlgeschlagen ist. Doch hierzu muss der &lt;i&gt;Callbackhandler&lt;/i&gt; &lt;i&gt;WriteBenutzerListe&lt;/i&gt; angepasst werden. Bevor ich dies tue, m&amp;ouml;chte ich das &lt;i&gt;Resultobjekt&lt;/i&gt; noch einmal n&amp;auml;her betrachten. &lt;/p&gt; &lt;p&gt; &lt;img alt="save-error" src="/images/ajaxpro/client4_save_error.png" style="width: 712px; height: 244px" /&gt;&lt;/p&gt; &lt;p&gt; Neben dem &lt;i&gt;error&lt;/i&gt;-Objekt und dem &lt;i&gt;value&lt;/i&gt;-Objekt beinhaltet das &lt;i&gt;Resultobjekt&lt;/i&gt; noch ein weiteres wichtiges Objekt - das &lt;i&gt;request&lt;/i&gt;-Objekt mit den Eigenschaften &lt;i&gt;args&lt;/i&gt; und &lt;i&gt;method&lt;/i&gt;. Die &lt;i&gt;method&lt;/i&gt;-Eigenschaft gibt Auskunft dar&amp;uuml;ber, welche Servermethode aufgerufen wurde. Das &lt;i&gt;args&lt;/i&gt;-Objekt beinhaltet alle an die Servermethode &amp;uuml;bergebene Parameter (Arguments). Mit diesem Hintergrundwissen kann der &lt;i&gt;Callbackhandler&lt;/i&gt; &lt;i&gt;WriteBenutzerListe&lt;/i&gt; nun angepasst werden. &lt;/p&gt; &lt;p&gt; &lt;img alt="saveerror1" src="/images/ajaxpro/client4_save_error1.png" style="width: 713px; height: 162px" /&gt;&lt;/p&gt; &lt;p&gt; Wenn also das &lt;i&gt;value&lt;/i&gt;-Objekt &lt;i&gt;null&lt;/i&gt; ist, obwohl ein Objekt erwartet wurde - n&amp;auml;mlich die Benutzerliste - dann wird &amp;uuml;ber die &lt;i&gt;method&lt;/i&gt;-Eigenschaft des &lt;i&gt;request&lt;/i&gt;-Objektes unterschieden, welche Meldung am Client auszugeben ist. Die Dropdownliste bleibt in diesem Fall unver&amp;auml;ndert, da ja die gew&amp;uuml;nschte Aktion am Server fehlgeschlagen ist.&lt;/p&gt; &lt;p&gt; &lt;img alt="saveerror2" src="/images/ajaxpro/client4_save_error2.png" style="width: 577px; height: 172px" /&gt;&lt;/p&gt; &lt;p&gt; Nicht viel anders verf&amp;auml;hrt man, will man einen Benutzer aus der Datenquelle l&amp;ouml;schen. Hierzu definiere ich wieder einen separaten Button, der mit einem onclick-Eventhandler versehen wird, welcher eine Javascriptmethode aufruft, die ihrerseits wieder eine Servermethode aufruft und dabei das zu l&amp;ouml;schende Benutzerobjekt an den Server &amp;uuml;bergibt und im Callbackeventhandler die Liste neu f&amp;uuml;llt. Auch hier wieder der Code im Detail:&lt;/p&gt; &lt;p&gt; &lt;img alt="delete" src="/images/ajaxpro/client_delete.png" style="width: 720px; height: 1215px" /&gt;&lt;/p&gt; &lt;p&gt; Die Javascriptmethode &lt;i&gt;DeleteBenutzer&lt;/i&gt; stellt den onClick-Eventhandler des L&amp;ouml;schen-Button dar. Als erstes wird das Infopanel gel&amp;ouml;scht, da der Benutzer eine neue Aktion angesto&amp;szlig;en hat. Dann wird die Servermethode &lt;i&gt;DeleteBenutzer&lt;/i&gt; (orange Markierung) der Ajaxklasse aufgerufen, wobei das aktuelle Benutzerobjekt wieder an den Server mit &amp;uuml;bergeben wird. Vom Prinzip h&amp;auml;tte an dieser Stelle auch ein String gen&amp;uuml;gt, die &lt;i&gt;ID&lt;/i&gt; des Benutzerobjektes. Als &lt;i&gt;Callbackhandler&lt;/i&gt; (blaue Markierung) wurde wieder die Methode &lt;i&gt;WriteBenutzerListe&lt;/i&gt; angegeben, da ja nach erfolgreicher L&amp;ouml;schung des Benutzers die Liste wieder aktualisiert werden muss, weshalb auch der R&amp;uuml;ckgabewert des &lt;i&gt;DeleteBenutzer&lt;/i&gt;-Methode wieder die Liste(Array) der Benutzer ist (gr&amp;uuml;ne Markierung). Da ich das Benutzerobjekt wieder sofort am Server verf&amp;uuml;gbar habe, kann hier die &lt;i&gt;Delete&lt;/i&gt;-Methode der &lt;i&gt;Benutzerklasse&lt;/i&gt; aufgerufen werden (rote Markierung). Anders als beim Speichern, muss mit dem R&amp;uuml;ckgabewert &lt;i&gt;null&lt;/i&gt; hier verfahren werden. Wenn &lt;i&gt;Benutzer.Liste()&lt;/i&gt; &lt;i&gt;null&lt;/i&gt; zur&amp;uuml;ckgibt, dann ist die Liste leer. Daher habe ich mich hier der Vorz&amp;uuml;ge des &lt;i&gt;error&lt;/i&gt;-Objekts bedient und einfach eine Exception ausgel&amp;ouml;st (lila Markierung), wenn das L&amp;ouml;schen am Server fehlschl&amp;auml;gt. Auf der Clientseite &amp;uuml;bertrage ich dann einfach die Exceptionmessage in das Infopanel. F&amp;uuml;r den Fall, dass das &lt;i&gt;value&lt;/i&gt;-Objekt null ist, muss sichergestellt sein, dass die Dropdownliste keine Eintr&amp;auml;ge enth&amp;auml;lt. Dies erreicht man, indem man die &lt;i&gt;length&lt;/i&gt;-Eigenschaft des &lt;i&gt;option&lt;/i&gt;-Objektes auf 0 setzt.&lt;/p&gt; &lt;p&gt; Was habe ich bisher erreicht: ich habe auf der Serverseite schlanken &amp;uuml;berschaubaren Code, der vom Client direkt aufgerufen werden kann und ich habe auf der Clientseite Code, den ich mehrfach verwenden kann. Ich brauchte keine zig-Scripdateien zus&amp;auml;tzlich einbinden, ich brauchte mich nicht darum zu k&amp;uuml;mmern, ob XMLRequest vom Browser &amp;uuml;berhaupt unterst&amp;uuml;tzt wird, ich brauchte f&amp;uuml;r die De-/Serialisierung der .NET-Objekte keine zus&amp;auml;tzliche Zeile Code schreiben - ich habe mich in der Kommunikation zwischen dem Client und dem Server auf das Wesentliche beschr&amp;auml;nkt - dem Austausch von Daten. Ohne Updatepanel haben sich Teilbereiche meiner Seite ver&amp;auml;ndert. Das grunds&amp;auml;tzliche Vorgehen ist immer das gleiche - egal wie gro&amp;szlig; und komplex die Anwendung am Ende ist. Das ist es, was Ajax.Pro (und etwas Javascript) ausmacht.&lt;/p&gt; &lt;p&gt; Was in der Beispielanwendung noch fehlt, ist die Neuanlage eines Benutzers. Dabei ist die halbe Arbeit schon getan, ohne dass es uns dabei wirklich bewusst ist. Doch der Reihe nach.&lt;/p&gt; &lt;p&gt; Der Dropdownliste f&amp;uuml;r die Anzeige der Benutzer wurde Eingangs ein onchange-Eventhandler zugewiesen. Dabei wurde die &lt;i&gt;ID&lt;/i&gt; des Benutzers mit an den Server &amp;uuml;bergeben, in der Hoffnung, auch das entsprechende Benutzerobjekt vom Server zur&amp;uuml;ck zu bekommen. Was ist aber, wenn kein Benutzer mit der &amp;uuml;bergebenen &lt;i&gt;ID&lt;/i&gt; gefunden wurde? Aus diesem Grund hatte ich der Benutzerklasse &lt;i&gt;zwei Konstruktoren&lt;/i&gt; spendiert, wobei der Standardkonstruktor eine neue Guid generiert und der &lt;i&gt;id&lt;/i&gt;-Eigeneschaft zuweist und im &amp;uuml;brigen alle weiteren Eigenschaften (&lt;i&gt;Nachname&lt;/i&gt;, &lt;i&gt;Vorname&lt;/i&gt;) einen Leerstring zuordnet. Der zweite Konstruktor ist mit dem &lt;i&gt;id&lt;/i&gt;-Parameter ausger&amp;uuml;stet, um im Weiteren den Benutzer mit der &amp;uuml;bergebenen &lt;i&gt;ID&lt;/i&gt; in der Datenquelle zu finden. Damit aber auch f&amp;uuml;r den Fall, dass kein Benutzer in der Datenquelle gefunden wird, ein verwendbares Benutzerobjekt zur&amp;uuml;ckgegeben wird, wurde sichergestellt, dass immer der Standardkonstruktor aufgerufen wird. Egal was passiert, es gibt immer ein Benutzerobjekt, das am Client weiter verarbeitet werden kann. Und genau diesen Umstand machen wir uns wieder zu nutze.&lt;/p&gt; &lt;p&gt; &lt;img alt="konstruktor" src="/images/ajaxpro/konstruktor.png" style="width: 345px; height: 201px" /&gt;&lt;/p&gt; &lt;p&gt; Also wird das Formular um einen Button zur Neuanlage eines Benutzers erweitert. Auch dieser Button wird mit einem onclick-Eventhandler ausgestattet, welcher &amp;uuml;ber die Javascriptmethode &lt;i&gt;AddBenutzer&lt;/i&gt; den Server aufruft. Damit bestehende Funktionalit&amp;auml;t genutzt werden kann, wird vorerst sichergestellt, dass die Dropdownlist auf den Index 0 gesetzt ist. Anschlie&amp;szlig;end wird die Ajax-Servermethode &lt;i&gt;GetBenutzer&lt;/i&gt; analog dem onchange-Eventhandler der Dropdownliste aufgerufen. Die &amp;uuml;brige Vorgehensweise entspricht der des onchange-Eventhandlers. Da ich nun innerhalb des &lt;i&gt;Callbackhandlers&lt;/i&gt; ein Formular erhalte, in dem nur die &lt;i&gt;ID&lt;/i&gt; besetzt ist, kann ich die &amp;uuml;brigen Felder ausf&amp;uuml;llen und den Speichern-Button verwenden. Beim Speichen muss jedoch die serverseitige Ajax-Methode &lt;i&gt;SaveBenutzer&lt;/i&gt; erweitert werden: Immer wenn das eigentliche Speichern des &amp;uuml;bergebenen Benutzerobjektes fehlschl&amp;auml;gt, wird die &lt;i&gt;Add&lt;/i&gt;-Methode der &lt;i&gt;Benutzerklasse&lt;/i&gt; aufgerufen. Scheitert das Hinzuf&amp;uuml;gen des Benutzers, so wird &lt;i&gt;null&lt;/i&gt; zur&amp;uuml;ckgegeben - in allen anderen F&amp;auml;llen die aktuelle Benutzerliste.&lt;/p&gt; &lt;p&gt; &lt;img alt="addBenutzer" src="/images/ajaxpro/client_addBenutzer.png" style="width: 720px; height: 733px" /&gt;&lt;/p&gt; &lt;p&gt; Und damit w&amp;auml;re ich am Ende meines kleinen Beispiels. Was man aber deutlich sehen kann ist, dass man mit Ajax.Pro seine Anwendung im Sinne des MVC-Pattern aufbauen kann, ohne dass man viel zus&amp;auml;tzlichen Code schreiben m&amp;uuml;sste. Einzig Disziplin wird dem Entwickler abverlangt bei der Einhaltung des Konzeptes: keine Logik am Client, so wenig wie n&amp;ouml;tig Programmcode in den Ajax-Servermethoden - daf&amp;uuml;r ist die Businessschicht da. Ajax.Pro konzentriert sich auf den Austausch von Daten zwischen Client und Server. Es werden nur die Methoden aufgerufen, die auch tats&amp;auml;chlich in der Client-Server-Kommunikation unmittelbar ben&amp;ouml;tigt werden. Und Ajax.Pro nutzt &lt;a href="http://www.json.org" accesskey="L" tabindex="0" title="zur Seite: json.org"&gt;JSON&lt;/a&gt; intensiv, so dass nahezu beliebige .NET-Objekte zwischen dem Client und dem Server in beiden Richtungen ausgetauscht werden k&amp;ouml;nnen.&lt;/p&gt; &lt;p&gt; Michael Schwarz h&amp;auml;lt &lt;a href="http://www.ajaxpro.info" accesskey="L" tabindex="0" title="zur Seite: ajaxpro.info"&gt;auf seiner Webseite zu Ajax.Pro&lt;/a&gt; noch viele weitere interessante Beispiele bereit. Dieser Beitrag sollte mal in etwas anderer Form einen kleinen Einstieg in Ajax.Pro vermitteln. Wenn es die Zeit erlaubt, m&amp;ouml;chte ich in folgenden Beitr&amp;auml;gen noch weiter zu Ajax.Pro schreiben und vor allem L&amp;ouml;sungsideen aufzeigen, die sich mit Ajax im Allgemeinen umsetzen lassen - ganz ohne Updatepanel.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/8FE24D67-434B-4231-B446-06CD8AD1276E/Datengebundene+Webanwendungen+mit+AJAX.PRO.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Fri, 24 Jul 2009 10:04:07 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.7A4D4D4D-EE32-4131-BF0E-052EC4498907.content.aspx</guid><title>AJAX.PRO - eine der besten .NET AJAX-Bibliotheken</title><description>&lt;div&gt; K&amp;uuml;rzlich war im &lt;a title="Zur Beitrag 'jQuery vs. Ajax Toolkit' " tabindex="0" href="http://nibblersrevenge.cluss.de/archive/2009/06/26/jquery-vs.-ajax-toolkit.aspx"&gt; Netz zu lesen&lt;/a&gt;, was so alles an Bibliotheken in der Webentwicklung eingesetzt wird. Hierbei verwundert es nicht sonderlich, dass jQuery -&amp;nbsp; wahrscheinlich auch durch die &lt;a title="Zur Beitrag 'jQuery and Microsoft' " tabindex="0" href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx"&gt; Ank&amp;uuml;ndigung&lt;/a&gt; von Microsoft, jQuery in der n&amp;auml;chsten Visual Studio Version von Haus aus zu unterst&amp;uuml;tzen - derzeit einen regelrechten Hype in der ASP.NET Entwicklung erlebt. &lt;/div&gt;&lt;div&gt; Noch heute liest man in den Foren hier und da von der Ablehnung Javascript gegen&amp;uuml;ber, wobei die gleichen Entwickler sich auf das AjaxToolkit st&amp;uuml;rzen, wie der L&amp;ouml;we auf das Fleisch. Und &lt;a title="Zur Beitrag 'Ajax.NET Professional noch immer unter den Top 5' " tabindex="0" href="http://michael-schwarz.blogspot.com/2009/06/ajaxnet-professional-noch-immer-unter.html"&gt; dann liest man&lt;/a&gt;, wie stolz es doch so manch gestandenen Entwickler macht, wenn dieser erf&amp;auml;hrt, dass die von ihm ins Leben gerufene AJAX-Bibliothek sich nach wie vor wacker unter den vorderen R&amp;auml;ngen h&amp;auml;lt.&lt;br /&gt; &lt;br /&gt; Ich kann es eigentlich nicht oft genug wiederholen - wobei ich an dieser Stelle auch betonen muss, dass es meiner tiefsten &amp;uuml;berzeugung entspricht und keine allgemeine Lobhudelei darstellt - AJAX.PRO ist f&amp;uuml;r mich seit Jahren die mit Abstand beste .NET Ajax-Bibliothek, die ich kenne. &lt;br /&gt; &lt;br /&gt; Was macht AJAX.PRO f&amp;uuml;r mich so interessant: Nun, keine andere Bibliothek ist so dicht am .NET, wie AJAX.PRO. &lt;br /&gt; Ich kann hier .NET Objekte serialisieren (ohne selbst eine Zeile Code schreiben zu m&amp;uuml;ssen, wie es doch in anderer Werbeaussage gern zitiert wird) zum Client senden und auch von diesem empfangen, ohne dass ich hier &amp;quot;wirklichen&amp;quot; Grenzen unterliege. Allein dieser Umstand erm&amp;ouml;glichte uns in der Firma ein .NET Objektmodell am Client zu verwenden, so dass die Lernkurve extrem niedrig ausfiel. Der geneigte C#-Entwickler hat Javascriptcode gelesen und wusste sofort, was Sache war. Ist das nicht genial?&lt;br /&gt; &lt;br /&gt; Dann kommt hinzu, dass sie sehr stabil l&amp;auml;uft. Wir haben in der Firma mehr Probleme mit anderen Bibliotheken, wie z.B. dem AjaxToolkit, wo Probleme seit Jahren bekannt sind (und in Foren diskutiert werden, nebst Patch und Hack, um das Problem zu l&amp;ouml;sen), aber in aktuellen Releases nicht eingearbeitet werden. Und was AJAX.PRO eben auch ausmacht, im Vergleich zu allen anderen - hier wird sich auf das wesentliche konzentriert - dem Datenaustausch - ohne viel Schnickschnack. &lt;br /&gt; &lt;br /&gt; Als ich k&amp;uuml;rzlich auf dem UG Event zu ASP.MVC von Albert Weinert war, staunte ich nicht schlecht, dass ASP.MVC nur JSON senden aber nicht empfangen kann - was soll ich damit anfangen. AJAX macht da erst richtig Spa&amp;szlig;, wo die Kommunikation in beiden Richtungen - vorbehaltlos - stattfindet. Und das macht halt AJAX.PRO. Ich bedauere es ebenso nach wie vor, dass die &amp;ouml;ffentliche Entwicklung eingestellt wurde - AJAX.PRO ist und bleibt eine echte Bereicherung in der .NET Webentwicklung. &lt;br /&gt; &lt;br /&gt; Ein alter Kollege hatte mal zu mir gesagt: "Ach AJAX.PRO ist viel zu aufgebl&amp;auml;ht, zu viel Ballast...". Das mag an einigen Stellen stimmen und auch wieder nicht. Denn eines darf man nie mit einander vergleichen: entwickle ich nur f&amp;uuml;r einen Browser (IE) und im Intranet oder f&amp;uuml;r eine Vielzahl von Anwendungsf&amp;auml;llen im Internet - das ist es aber, was AJAX.PRO abdeckt. Insofern ist AJAX.PRO durchaus eine schlanke Bibliothek. Das "Abrutschen" in der Scala mag aus meiner Sicht zwei Ursachen haben: es wird (leider) nicht (&amp;ouml;ffentlich) weiter entwickelt und der eine oder andere tut sich schwer mit der Implementierung/Dokumentation. &lt;br /&gt; &lt;br /&gt; Ich werde es jedenfalls weiter einsetzen - mit oder ohne Weiterentwicklung. Daf&amp;uuml;r ist AJAX.PRO einfach zu gut. &lt;/div&gt;</description><link>http://weblog.drescher-hackel.de/7A4D4D4D-EE32-4131-BF0E-052EC4498907/AJAX.PRO+-+eine+der+besten+.NET+AJAX-Bibliotheken.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Thu, 02 Jul 2009 21:45:27 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.E336C3D4-7E11-4972-BB5B-A9C3FB5744A8.content.aspx</guid><title>Ajax-Toolkit und die Webkit Browser</title><description>&lt;div&gt;Heute habe ich nicht schlecht gestaunt, als ich mich wieder einmal intensiver als &amp;uuml;blich mit dem Ajax-Toolkit auseinander gesetzt habe.&lt;br /&gt; Ob man will oder nicht, hin und wieder ist man &lt;i style="text-decoration:line-through"&gt;gezwungen&lt;/i&gt; gehalten Controls aus dem Ajax-Toolkit einzusetzen. Was man gerne dabei vergisst, ist die Tatsache,&lt;br /&gt; dass das Toolkit weiterentwickelt wird.&lt;br /&gt; &lt;br /&gt; Und so habe ich heute aus gegebenen Anlass die Assembly einmal aktualisiert - warum eigentlich nur??&lt;br /&gt; &lt;br /&gt; Hintergrund des ganzen war ein Problem, welches ich hatte mit den Webkit-Browsern &lt;i&gt;Safari&lt;/i&gt; und &lt;i&gt;Chrome&lt;/i&gt;. Beide Browser hatten ein Problem damit, wenn man&lt;br /&gt; Controls aus dem Ajax-Toolkit innerhalb eines Updatepanels l&amp;auml;dt. Sicher wird der eine oder andere sagen: dann l&amp;ouml;se es anders, verzichte auf Updatepanel und Ajax-Toolkit. Ja, stimme ich voll zu, doch gelegentlich werden politische Entscheidungen getroffen, an denen dann nur schwer ein Weg vorbei f&amp;uuml;hrt - doch lassen wir dieses Thema. Es ist wie es ist und eine L&amp;ouml;sung musste her.&lt;br /&gt; &lt;br /&gt; Wie gesagt, die o.g. Webbrowser hatten gelegentlich ein Problem mit dieser Konstellation. Es schien, als w&amp;uuml;rde der Webrequest nicht vollst&amp;auml;ndig verarbeitet werden. Beim Debuggen und der ersten Fehleranalyse vor gut einem Jahr&amp;nbsp; kam ich darauf, dass das Problem wohl in einem Scriptfehler irgendwo in den Scripten des Ajax-Toolkit liegt. Ich hatten nicht wirklich Lust, das weiter zu verfolgen - bis heute. Heute hat mich dann die ganze Angelegenheit wieder eingeholt - und ich muss sagen, am Ende waren es gerade mal knapp 2 Stunden Zeit, die ich investieren musste, um zu einer L&amp;ouml;sung zu gelangen.&lt;br /&gt; &lt;br /&gt; Was mich an der ganzen Geschichte am meisten aber &amp;auml;rgert ist, dass es denn keiner bislang geschafft hat, das Ajax-Toolkit in dieser Hinsicht gescheit zu aktualisieren.&lt;br /&gt; &lt;br /&gt; Die L&amp;ouml;sung fand ich letztlich im ASP.NET-Forum &lt;a accesskey="l" tabindex="0" title="zum Beitrag im ASP.NET Forum" href="http://forums.asp.net/p/1252014/2392110.aspx"&gt;hier&lt;/a&gt;. &lt;br /&gt; Eine kleine Scriptdatei mit folgendem Inhalt sollte man sich erstellen:&lt;br /&gt; &lt;br /&gt; Sys.Browser.WebKit = {}; //Safari 3 is considered WebKit&lt;br /&gt; if( navigator.userAgent.indexOf( &amp;#39;WebKit/&amp;#39; ) &amp;gt; -1 ) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.Browser.agent = Sys.Browser.WebKit; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.Browser.version = parseFloat( navigator.userAgent.match(/WebKit\/(\d+(\.\d+)?)/)[1]); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.Browser.name = &amp;#39;WebKit&amp;#39;; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; Das Ganze dann im Scriptmanager wie folgt einbinden:&lt;br /&gt; &lt;br /&gt; &amp;lt;asp:ScriptManager ID=&amp;quot;ScriptManager1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Scripts&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:ScriptReference Path=&amp;quot;~/Scripts/Safari3AjaxHack.js&amp;quot; /&amp;gt; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Scripts&amp;gt; &lt;br /&gt; &amp;lt;/asp:ScriptManager&amp;gt;&lt;br /&gt; &lt;br /&gt; Fertig. Super!&lt;br /&gt; &lt;br /&gt; Auf dem Weg zu dieser L&amp;ouml;sung war ich auch schon dabei - wie oben erw&amp;auml;hnt - das Ajax-Toolkit zu aktualisieren. Also aktuelle Version herunter geladen und eingebunden. Auch mal die Scripte geholt und &amp;uuml;ber den Scriptmanager vom ScriptPath geladen. Hier kam dann die n&amp;auml;chste &amp;Uuml;berraschung. Die Scripte passten in der Versionsnummer nicht zu der im Downloadbereich&amp;nbsp; angebotenen Assembly. So kann das nicht funktionieren. Vielleicht bemerkt es ja mal jemand...&lt;br /&gt; &lt;br /&gt; &lt;i&gt;Am Ende dachte ich so: wie sch&amp;ouml;n k&amp;ouml;nnte AJAX sein, wenn man das alles nicht br&amp;auml;uchte... &lt;/i&gt;&lt;/div&gt;</description><link>http://weblog.drescher-hackel.de/E336C3D4-7E11-4972-BB5B-A9C3FB5744A8/Ajax-Toolkit+und+die+Webkit+Browser.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Thu, 25 Jun 2009 22:41:53 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.6B4214BB-D66B-4D09-BC49-63F32E65411E.content.aspx</guid><title>Ajax Fileupload Fortschrittsanzeige </title><description>&lt;div&gt;Wer sich mit dem Fileupload beschäftigt, steht irgendwann vor dem Problem, wie denn die Fortschrittsanzeige im Webbrowser sich umsetzen lässt. &lt;br /&gt;Die Hardcorelösung wäre, den Benutzer auf die Anzeige in der Browserstatusanzeige zu verweisen. Die inzwischen häufigste Variante des Fileuploads besteht darin, für das Versenden der Datei ein &lt;i&gt;iframe&lt;/i&gt;-Element zu verwenden. Zwar wird mitunter durch den Browser visuell signalisiert, dass sich da etwas tut, doch bekommt das der Benutzer jetzt noch weniger mit, wie beim Full-Postback der Seite.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Immer wieder trifft man im Netz auf Lösungen, die für die Zeit des Uploads eine animierte Grafik einblenden. Andere wiederum berechnen einen Uploadfortschritt auf Basis des für die Darstellung zur Verfügung stehenden Containers. Ist das Ende des Containers erreicht, fängt die Fortschrittsanzeige wieder von vorn an.&lt;br /&gt;&lt;br /&gt;Worin besteht das Problem? Das &lt;i&gt;iframe&lt;/i&gt; kann den Benutzer in der Regel informieren über den onload Event - doch dann hat aller Spuck oft ein Ende. Im Rahmen dieses Events beenden die meisten Entwickler die Darstellung ihrer Uploadanimationen. &lt;br /&gt;&lt;br /&gt;Angeregt durch die Möglichkeiten, welche die Flashprogrammierung einem offenbaren, wollte ich einen halbwegs realistischen Uploadfortschritt im HTML mit Javascript realisieren. So suchte ich nach den Dingen, die mir letztlich zur Verfügung standen. Das waren&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;das &lt;i&gt;iframe&lt;/i&gt;&lt;/li&gt;&lt;li&gt;der Uploadhandler (das &lt;i&gt;document&lt;/i&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Für das &lt;i&gt;document&lt;/i&gt; gibt es die Eigenschaft &lt;i&gt;readyState&lt;/i&gt; - die, wie sollte es auch anders sein - kein Standard ist. Aber welche Informationen bietet mir diese Eigenschaft? Solange das &lt;i&gt;document&lt;/i&gt; geladen wird ist der Wert &lt;i&gt;loading&lt;/i&gt; oder (beim Opera-Browser) - &lt;i&gt;interactive&lt;/i&gt;. Beide haben aber den Wert &lt;i&gt;complete&lt;/i&gt;, wenn das &lt;i&gt;document&lt;/i&gt; vollständig übertragen ist. Webbrowser, die diese Eigenschaft nicht unterstützen, muss man dann etwas austricksen. Nun braucht man eigentlich nur noch dafür zu sorgen, dass dieser Status regelmäßig geprüft wird. Die folgende Javascript-Methode zeigt einen möglichen Ansatz:&lt;br /&gt;&lt;br /&gt;var iframeProgress = function(iframe, state, percent) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (iframe[0].contentWindow) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var doc = iframe.contents(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (doc != undefined &amp;amp;&amp;amp; doc.length == 1) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var newstate = $.browser.msie ? doc[0].readyState : "loading"; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (newstate != state &amp;amp;&amp;amp; newstate != "complete") { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (percent &amp;lt; 98) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // hier die Progressanzeige aktualisieren&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setTimeout(function() { iframeProgress(iframe, state, percent += 2); }, 400); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (ex) { }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;In dem Moment, wo der &lt;i&gt;submit&lt;/i&gt; Event der Form getriggert wird, wird mit einer kleinen Verzögerung die Methode &lt;i&gt;iframeProgress&lt;/i&gt; aufgerufen, der als Parameter das &lt;i&gt;iframe&lt;/i&gt;-(jQuery)Objekt, der Status und die aktuellen Prozentwerte der übertragung mit übergeben werden. Das der Firefox z.B. die &lt;i&gt;readyState&lt;/i&gt; - Eigenschaft nicht kennt, schiebe ich ihm diese einfach unter. Die Prüfung auf den Wert &lt;i&gt;complete&lt;/i&gt; wird der Firefox ebenso nicht anders beantworten können, so dass die Prozentzahl um 2 erhöht und die Methode erneut aufgerufen wird. Dies passiert so lange, bis der &lt;i&gt;onload&lt;/i&gt; Event des &lt;i&gt;iframe&lt;/i&gt; selbst ausgelöst wird oder der fiktive Prozentwert 98 erreicht ist. Ich habe das Szenario mit Uploadgrößen von bis zu 47 MB getestet. Die Variation der Fortschrittsanzeige besteht im Verändern des Timeoutwertes und der Schrittweite des Hochzählens des Prozentwertes.&lt;br /&gt;&lt;br /&gt;&lt;img style="width: 670px; height: 95px;" alt="uploadprogress" src="/images/upload.png" /&gt;&lt;br /&gt;&lt;br /&gt;Am Ende kann man aber auf diesem Wege eine halbwegs realistische Fortschrittsanzeige im HTML mit Javascript realisieren.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;</description><link>http://weblog.drescher-hackel.de/6B4214BB-D66B-4D09-BC49-63F32E65411E/Ajax+Fileupload+Fortschrittsanzeige+.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Fri, 05 Jun 2009 21:28:23 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.D9E4DA8D-727F-4196-84D3-5C16EC1B831C.content.aspx</guid><title>Webslice - kann man implementieren - muss man aber nicht</title><description>&lt;div&gt; Durch einen Beitrag im &lt;a accesskey="L" title="zum Beitrag im dotnet-forum" tabindex="0" href="http://dotnet-forum.de/forums/p/1531/5557.aspx#5557"&gt;dotnet&lt;/a&gt;-forum dazu ermuntert, habe ich mich nun mit der Erstellung und Implementierung von Webslices besch&amp;auml;ftigt. Ich erspare mir an dieser Stelle, die Standarddefinitionen von Webslices in aller Ausf&amp;uuml;hrlichkeit zu wiederholen. Es gibt dazu gen&amp;uuml;gend Fundstellen im Netz zu finden. Was ich mich allerdings gefragt habe war, wer braucht so etwas?&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;br /&gt; Diese Antwort l&amp;auml;sst sich wohl nie abschlie&amp;szlig;end kl&amp;auml;ren, zumal es ohnehin eine Funktionalit&amp;auml;t ist, die derzeit nur in einem Browser, dem Internet Explorer 8, funktioniert. Wer aber jeden Trend auf seiner Webseite mit machen will, f&amp;uuml;r den lohnt es sich, dass er sich mit diesem Thema einmal auseinander setzt. Doch wie implementiert man nun einen Webslice.&lt;br /&gt; &lt;br /&gt; Im Internet fand ich zu diesem Thema zwei recht gute Beschreibungen. Zum einen hat sich &lt;a accesskey="L" tabindex="0" title="zur Seite von Klaus Bock" href="http://blog.klaus-b.net/post/2009/03/08/Einen-Web-Slice-erzeugen-und-anbieten.aspx"&gt; Klaus Bock&lt;/a&gt; damit in seinem Weblog befasst und auch &lt;a accesskey="L" tabindex="0" href="http://msdn.microsoft.com/de-de/magazine/dd458804.aspx" title="zur Seite mit dem Beitrag von Daron Y&amp;ouml;ndem"&gt; Daron Y&amp;ouml;ndem&lt;/a&gt;. &lt;br /&gt; &lt;br /&gt; Im Wesentlichen reduziert sich die Definition von Webslices auf einen DIV Container mit mindestens einem bzw. zwei weiteren Child-Elementen. Was als Webslice vom Browser dabei erkannt und wie deren Funktionalit&amp;auml;t umgesetzt wird, bestimmen die Css-Klassennamen der Elemente. F&amp;uuml;r das Basiselement ist dabei der Klassenname &lt;i&gt;hslice&lt;/i&gt; zwingend. Als erstes Child-Element folgt in der Regel ein den Titel bestimmenden Container. Hierbei kann man nahezu jedes HTML-Element verwenden, wobei H1, DIV oder SPAN-Elemente am sinnvollsten erscheinen. Das Titel-Element erh&amp;auml;lt dann den Css-Klassennamen &lt;i&gt;entry-title&lt;/i&gt;. Das, was innerhalb des Titel-Tags angeben wird, verarbeitet der Browser dann in der Anzeige des Webslice. Das Titel-Element kann man in der Regel ausblenden mit der style-Anweisung &amp;quot;&lt;i&gt;display:none&lt;/i&gt;&amp;quot; (dazu weiter unten mehr). &lt;br /&gt; Das zweite Element beinhaltet den eigentlichen Content. Hier sollte man ein DIV-Element w&amp;auml;hlen und muss diesem den Css-Klassennamen &lt;i&gt;entry-content&lt;/i&gt; zuweisen. Innerhalb dieses Containers kann man seinen HTML-Phantasien freien Lauf lasen, sprich g&amp;uuml;ltiges HTML ist zul&amp;auml;ssig.&lt;br /&gt; &lt;br /&gt; Also wenn man es sich recht betrachtet, ist es nicht wirklich viel Aufwand. Damit das ganze nun auch brav vom Browser erkannt wird, bedarf es noch einer Erweiterung im Head-Tag der Seite. Hierzu wird ein Link-Tag eingef&amp;uuml;gt, welches die Attribute &lt;i&gt;rel&lt;/i&gt; mit dem Wert &lt;i&gt;default-slice&lt;/i&gt;, &lt;i&gt;type&lt;/i&gt; mit dem Wert &lt;i&gt;application/x-hatom&lt;/i&gt; und &lt;i&gt;href&lt;/i&gt; haben muss. Der Wert f&amp;uuml;r das href Attribute ist dabei die ClientID des DIV-Containers, der den Css-Klassennamen &lt;i&gt;hslice&lt;/i&gt; zugewiesen bekommen hat. M&amp;ouml;chte man mehrere Webslices auf der Seite platzieren, so muss f&amp;uuml;r jeden Webslice ein separater Link-Tag im Head der Seite vorhanden sein.&lt;br /&gt; &lt;br /&gt; Hat man alles richtig gemacht, dankt es der Internet Explorer 8 mit einem kleinen gr&amp;uuml;nen Symbol. &lt;br /&gt; &lt;br /&gt; &lt;img alt="Websliceinfo" src="/images/webslice1.png" style="width: 600px; height: 205px" /&gt;&lt;br /&gt; &lt;br /&gt; Wie Klaus und Daron schon beschrieben haben, kann man den Content des Webslice auch &amp;uuml;ber eine separate Seite organisieren oder z.B. bei Verwendung innerhalb einer Masterpage &amp;uuml;ber diese, wobei der &lt;i&gt;hslice&lt;/i&gt;-Container standardm&amp;auml;&amp;szlig;ig nicht sichtbar ist bzw. sein sollte. &lt;br /&gt; &lt;br /&gt; In meinem Fall habe ich mich daf&amp;uuml;r entschieden, den Webslice entsprechend der darzustellenden Aufgabe sichtbar innerhalb des Seiteninhaltes zu platzieren. Der Webslice soll dabei immer den zuletzt ver&amp;ouml;ffentlichten Beitrag darstellen. Die Vorgehensweise entspricht der oben beschriebenen, wobei es wichtig war, das HTML-Element mit dem Titel des Webslice auszublenden, da er sich sonst nicht in das bestehende Layout der Seite integrieren lie&amp;szlig;e. Ein weiterer Nebeneffekt bei dieser Form der Implementierung liegt in der Darstellung des Webslice selbst. Will man den Blogbeitrag weiterlesen, so muss man zwangsl&amp;auml;ufig mit der Mouse &amp;uuml;ber den &lt;i&gt;hslice&lt;/i&gt;-Container sich bewegen. In genau diesem Moment erscheinen ein gr&amp;uuml;ner Rahmen und das Webslice-Icon. Durch Anklicken des Icons kann man diesen Webslice abonnieren.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Webslice im Content" src="/images/webslice2.png" style="width: 600px; height: 265px" /&gt;&lt;br /&gt; &lt;br /&gt; Nachteilig an den gesamten Webslice-Implementierungsm&amp;ouml;glichkeiten finde ich jedoch die unzureichende Art der Nutzung von Javascript. Hier h&amp;auml;tte ich mir mehr M&amp;ouml;glichkeiten vorstellen k&amp;ouml;nnen. Weiterhin habe ich noch keine M&amp;ouml;glichkeit gefunden, dass der Flayout-Container scrollbar ist. &lt;br /&gt; Vorteilhaft finde ich, dass trotz der Insell&amp;ouml;sung, nach der Implementierung die Seite immer noch den Anforderungen des W3C entspricht. Ebenso von Vorteil ist es, dass man das CSS des Webslice so gestalten kann, dass es noch an die Ursprungsseite erinnert und nicht nur einfache Links mit etwas Text m&amp;ouml;glich sind.&lt;br /&gt;&lt;br /&gt;&lt;img alt="Webslice-Abo-Ansicht" src="/images/webslice3.png" style="width: 600px; height: 362px" /&gt;&lt;br /&gt; &lt;br /&gt; Unterm Strich kann man sagen: &lt;i&gt;kann man haben - muss man aber nicht&lt;/i&gt; (vor allem, weil es nur &lt;i&gt;derzeit in einem&lt;/i&gt; Webbrowser funktioniert).&lt;/div&gt;</description><link>http://weblog.drescher-hackel.de/D9E4DA8D-727F-4196-84D3-5C16EC1B831C/Webslice+-+kann+man+implementieren+-+muss+man+aber+nicht.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Mon, 01 Jun 2009 15:04:50 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.505332EF-8067-4194-A269-4391530540EB.content.aspx</guid><title>Auch das Kleingedruckte sollte man immer lesen</title><description>  Gewinnspiele sind sicherlich nett, wenn man denn etwas gewinnt. Den Sinn eines Gewinnspieles darf man mitunter nicht n&amp;auml;her hinterfragen. So ist es auch bei &lt;a accesskey="l" title="zur Seite mit dem Gewinnspiel" href="http://blogs.msdn.com/softwarehersteller/archive/2009/05/06/msdn-blog-parade-was-sind-ihre-lieblings-entwickler-tools-mitmachen-und-gewinnen.aspx"&gt; folgendem Gewinnspiel&lt;/a&gt;. So las ich k&amp;uuml;rzlich im Weblog von &lt;a accesskey="l" title="zur Seite von Jan Welker" href="http://blog.jan-welker.de/2009/05/16/meinetop3entwicklertools.aspx"&gt;Jan Welker&lt;/a&gt;, dass ein jemand etwas verlost, wenn man sich denn offenbart und seine drei liebsten Entwicklertool benennt und vielleicht auch noch zwei S&amp;auml;tze, warum dies so ist. &lt;p /&gt; Ja, da kann man wohl teilnehmen, dachte ich mir so... Dann las ich mal die Teilnahmebedingungen, denn schlie&amp;szlig;lich geht nichts in diesem Land, ohne ordentliche Bedingungen. ;-) &lt;p /&gt; Und unter Punkt 11 stand dann, dass Gew&amp;auml;hrleistungsanspr&amp;uuml;che hinsichtlich der Gewinne ... ausgeschlossen sind. &lt;p /&gt; Ups - gewinne ich etwas, was m&amp;ouml;glicherweise mal kaput gehen k&amp;ouml;nnte, dann darf ich es gleich in die Tonne schmei&amp;szlig;en, da ja Punkt 11 gilt. Also auf Ideen kommen die Leute... &lt;p /&gt; Doch zur&amp;uuml;ck zum Thema. Von abgesehen, dass der potentiell in Aussicht gestellt Gewinn mich eher weniger reizt (das demn&amp;auml;chst auf den Markt kommende Betriebssystem w&amp;auml;re da sicher interessanter ;-)), &lt;p /&gt; so sind meine drei Favoriten: &lt;ul&gt; &lt;li title="visual studio"&gt;Visual Studio&lt;/li&gt; &lt;li title="sourcesafe"&gt;Sourcesafe&lt;/li&gt; &lt;li title="notepad"&gt;Notepad&lt;/li&gt; &lt;/ul&gt; &lt;p /&gt; Mit Visual Studio arbeite ich von anbeginn (fr&amp;uuml;her noch als Interdev ). Warum ich es sch&amp;auml;tze: nun, ich k&amp;ouml;nnte nicht alle Vorz&amp;uuml;ge hier aufz&amp;auml;hlen, doch hat es &amp;uuml;ber Jahre hinweg mir stehts die Arbeit erleichert - es sind die vielen kleinen Helferlein, die in diesem Programm stecken (auch wenn es mich gelegentlich wahnsinnig macht, wie aktuell die Initialisierung der Toolbox, wenn man das erste Mal eine Datei &amp;ouml;ffnet). &lt;p /&gt; Sourcesafe ist unverzichtbarer Bestandteil meiner t&amp;auml;glichen Arbeit, welches sich ebensogut ins Visual Studio integriert. &lt;p /&gt; Notepad: nun, hin und wieder geht es nicht ohne - es ist der beste "Schmierzettel" am PC.</description><link>http://weblog.drescher-hackel.de/505332EF-8067-4194-A269-4391530540EB/Auch+das+Kleingedruckte+sollte+man+immer+lesen.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 16 May 2009 20:32:25 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.09761EBD-1D09-42F1-9CDB-B0AE7081D625.content.aspx</guid><title>Ajax Fileupload</title><description> &lt;p&gt;Wer sich mit der Entwicklung von Webanwendungen besch&amp;auml;ftigt, kommt sicher nicht umhin, auch einmal ein Upload-Formular zu erstellen. In Zeiten des &amp;quot;Web 2.0&amp;quot; (wof&amp;uuml;r diese Bezeichnung auch immer stehen mag) werden die W&amp;uuml;nsche und Ideen auch immer anspruchsvoller. Und so verwunderte es nicht all zu sehr, dass mit dem AJAX-Hype der Gedanke aufkam, so ein sch&amp;ouml;nen Dateiupload per AJAX zu erledigen. Es folgte ziemlich schnell die Erkenntnis, dass dies nicht geht und wahrscheinlich auch k&amp;uuml;nftig so nicht gehen wird, will man sich auf den klassischen XML-Request beschr&amp;auml;nken. &lt;/p&gt; &lt;p&gt; Eine schon vor dem AJAX-Hype viel genutzte Variante war, die Datei, die zum Server zu &amp;uuml;bertragen ist, &amp;uuml;ber ein nicht sichtbares Frame zu senden. Anf&amp;auml;nglich wurde hierzu das Frameset genutzt, wobei ein Frame mit 0 definiert wurde, so dass der dort stattfindende Request f&amp;uuml;r den Benutzer der Seite verborgen blieb. In der Folgezeit ging man jedoch immer mehr dazu &amp;uuml;ber, das &lt;i&gt;iframe&lt;/i&gt;-Element zu nutzen.&lt;/p&gt; &lt;p&gt;&amp;nbsp;Dies ist bis heute die wohl weit verbreiteste Form der &amp;quot;versteckten&amp;quot; Hintergrund&amp;uuml;bertragung von Datein zum Server. Und genau vor diesem Hintergrund machte ich mich die Tage auf, das Netz zu durchforsten, was es an Ideen schon gibt, so dass man einen - sagen wir mal kompfortablen - Dateiupload erstellen kann. &lt;/p&gt; &lt;p&gt; Die aus meiner Sicht vielversprechendste L&amp;ouml;sung bot sich bei &lt;a href="http://valums.com/ajax-upload/" title="Zur Seite von Andrew Valums"&gt;Andrew Valums&lt;/a&gt;, der ein entsprechendes Javascript unter der MIT-License ver&amp;ouml;ffentlicht hat. Vieles, was diese L&amp;ouml;sung bietet, ist eigentlich genau das, was man sich - will man es denn so bezeichnen - unter einem AJAX-Upload vorstellt. Andrew hat dabei den Einsatz mit &lt;a href="http://www.prototypejs.org/" title="zur Seite vom prototype-Framework"&gt;prototype&lt;/a&gt; als auch &lt;a href="http://www.jquery.com" title="zur Seite von jQuery"&gt;jQuery&lt;/a&gt; ber&amp;uuml;cksichtigt. Besonders gelungen ist auch meiner Sicht, die Umsetzung des Klickevents zum Anzeigen des &lt;i&gt;input&lt;/i&gt;-File-Dialoges. Hierbei wird die Mausbewegung im &lt;i&gt;document&lt;/i&gt; &amp;uuml;berwacht und sobald sich die Maus &amp;uuml;ber dem Bereich befindet, der den eigentlichen Dialog &amp;ouml;ffnen soll, wird das nicht sichtbare &lt;i&gt;input&lt;/i&gt;-File-Element unter dem Mauszeiger plaziert. Ein jetzt erfolgender Klick f&amp;uuml;hrt somit immer zum Öffnen des File-Dialoges.&lt;/p&gt; &lt;p&gt;&lt;img alt="Position input file Element" src="/images/fileinputposition.png" style="width: 450px; height: 254px" /&gt;&lt;/p&gt; &lt;p&gt; Da &amp;uuml;ber die CSS-Attribute des &lt;i&gt;input&lt;/i&gt;-File-Elementes dieses vollst&amp;auml;ndig unsichtbar gemacht werden kann, bekommt der Benutzer von diesem Verhalten nichts mit. &lt;br /&gt; Nachteilig an der Version von Andrew ist jedoch, dass beim Verlassen des Bereiches das &lt;i&gt;input&lt;/i&gt;-File-Element noch mitwandert und ich faktisch auch ausserhalb meines eigentlich gedachten Upload-Bereiches den File-Dialog &amp;ouml;ffnen k&amp;ouml;nnte. Derartiges kann bei Benutzern leicht zu Irritationen f&amp;uuml;hren. Die L&amp;ouml;sung liegt derweil auf der Hand - man positioniert einfach das input-File-Element au&amp;szlig;erhalb des sichtbaren Bereiches. &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;img alt="Fehlposition input file" src="/images/sichtbarerfiledialog.png" style="width: 335px; height: 364px" /&gt;&lt;/p&gt; &lt;p&gt; Weiter positiv in der Umsetzung fand ich, dass die drei klassischen Eventhandler mit implementiert sind. &lt;/p&gt; &lt;p&gt; Als erstes kann man auf der Anwendungseite reagieren, sobald eine Datei &amp;uuml;ber den File-Dialog ausgew&amp;auml;hlt wurde. Als Parameter gibt Andrew dann den Dateinamen als auch die Dateierweiterung mit. &lt;br /&gt; Ein weiteres Mal kann vor dem Absenden der Datei zum Server noch einmal auf Anwendungsseite reagiert werden, wobei auch hier der Dateiname und die Dateierweiterung als Parameter zur Verf&amp;uuml;gung stehen. Zu guter Letzt kann man entsprechend noch reagieren, wenn dann die Datei zum Server &amp;uuml;bertragen wurde, der eigentliche Upload also fertig ist. &lt;br /&gt; &lt;br /&gt; Muss man im Zusammenhang mit dem Dateiupload noch weitere Daten zum Server mit &amp;uuml;bertragen, so kann man &amp;uuml;ber das &lt;i&gt;option&lt;/i&gt;-Objekt bei der Initialisierung ein &lt;i&gt;data&lt;/i&gt;-Objekt mit angebengeben. Bei der Vorbereitung des Postbacks werden dann entsprechende &lt;i&gt;input&lt;/i&gt;-Hidden-Elemente angelegt und mit zum Server &amp;uuml;bertragen. &lt;/p&gt; &lt;p&gt; &lt;img alt="input hidden Elemente" src="/images/dataobject.png" style="width: 412px; height: 144px" /&gt;&lt;/p&gt; &lt;p&gt; Eines hatte ich jedoch vermisst. Was passiert eigentlich, wenn ich einen Multifileupload mit dieser L&amp;ouml;sung umsetzen m&amp;ouml;chte. Eigentlich passte soweit alles, bis ich eine Datei ausw&amp;auml;hlte, die in der Liste schon vorhanden war. Im onComplete-Eventhandler jetzt die Datei allein &amp;uuml;ber den Namen zu identifiezieren war zum Scheitern verurteilt. Ich brauchte also einen Key, der im onChange-Eventhandler schon zur Verf&amp;uuml;gung stand, so dass ich diesen auf Anwendungsseite verarbeiten konnte, um dann bei Abschluss des Uploads den richtigen Eintrag in der Liste wiederzufinden. Sch&amp;ouml;n w&amp;auml;re, wenn es soetwas wie eine GUID im Javascript g&amp;auml;be. &lt;/p&gt; &lt;p&gt; &lt;a href="http://note19.com/2007/05/27/javascript-guid-generator/" title="Zur Seite http://note19.com/2007/05/27/javascript-guid-generator/ "&gt;Hier&lt;/a&gt; fand ich dann eine L&amp;ouml;sung, die mir hier weiterhelfen sollte. &lt;br /&gt; Sicher gibt es auch andere, vielleicht auch einfachere L&amp;ouml;sungsans&amp;auml;ntze (string + counter) f&amp;uuml;r mein Problem mit dem Key, doch schwebte mir in der Tat dieser GUID-Gedanke im Kopf, so dass ich diese letztlich favorisierte. Also baute ich mir schnell ein GUID-Objekt, und modifizierte den R&amp;uuml;ckgabeparameter in den Eventhandlern entsprechend. &lt;br /&gt; &lt;br /&gt; Das eigentliche Senden der Datei erfolgt dann auch wieder &amp;uuml;ber ein f&amp;uuml;r den Benutzer nicht sichtbares &lt;i&gt;iframe&lt;/i&gt;-Element. Gut fand ich auch in diesem Zusammenhang, das Andrew sich auch das entsprechend f&amp;uuml;r den Dateiversandt erforderliche Formular gek&amp;uuml;mmert und ein separates &lt;i&gt;form&lt;/i&gt;-Element mit dem entsprechenden &lt;i&gt;enctype&lt;/i&gt;-Attribute (enctype=&amp;quot;multipart/form-data&amp;quot;) angelegt hat. &lt;br /&gt; &lt;br /&gt; Insgesamt eine runde Sache, die Andrew mit seinem Javascript hier erstellt hat. &lt;br /&gt; &lt;br /&gt; Da ich prototype nicht einsetze, habe ich die Scriptdatei f&amp;uuml;r meine Bed&amp;uuml;rfnisse angepasst und st&amp;auml;rker dem Umstand Rechnung getragen, dass in meinen Projekten jQuery zum Einsatz kommt. &lt;br /&gt; Andrew setzt hingegen kein spezielles Framework voraus.&lt;/p&gt; </description><link>http://weblog.drescher-hackel.de/09761EBD-1D09-42F1-9CDB-B0AE7081D625/Ajax+Fileupload.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 02 May 2009 20:40:39 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.0346129F-7535-4C76-90D6-C6E4BE929EC4.content.aspx</guid><title>Barrierefrei, W3C-Konform und andere Wünsche</title><description> &lt;p&gt; Wenn man als Webentwickler sich dabei macht und eine neue Anwendung plant, dann kommen viele W&amp;uuml;nsche auf. Als letztes denkt man aber an die strikte Einhaltung von bestimmten Standards. So habe ich mir mit der Neugestaltung des Weblogs das Ziel gesetzt, die &lt;a accesskey="L" title ="zur Seite www.w3.org" href ="http://www.w3.org/"&gt;W3C-Standards &lt;/a&gt;strikt einzuhalten und nach M&amp;ouml;glichkeit &lt;a accesskey="L" title ="zur Seite www.w3.org" href ="http://www.w3.org/tr/wai-webcontent/"&gt; barrierefrei&lt;/a&gt; zu sein. &lt;/p&gt; &lt;p&gt; Andererseits mochte ich nicht auf die so lieb gewonnenen Javascriptfunktionalit&amp;auml;ten wie &lt;a accesskey="L" title ="zur Seite de.wikipedia.org" href="http://de.wikipedia.org/wiki/Ajax_(Programmierung)"&gt;AJAX&lt;/a&gt; und jQuery verzichten. Auch hatte ich dabei im Blick, wie wohl so manch Suchmaschine die Seite am besten durchsuchen und indizieren kann. &lt;/p&gt; &lt;p&gt; Was die Suchmaschine angeht, hab ich eine L&amp;ouml;sung bei &lt;a accesskey="L" title ="zur Seite von Thomas Bandt" href="http://blog.thomasbandt.de/"&gt; Thomas Bandt&lt;/a&gt; und &lt;a accesskey="L" title ="zur Seite von Albert Weinert" href ="http://der-albert.com/"&gt;Albert Weinert&lt;/a&gt; gefunden, die das Projekt &lt;a accesskey="L" title ="zur Seite von www.urlrewriting.net" href ="http://www.urlrewriting.net/"&gt;URL-Rewriting&lt;/a&gt; in&amp;nbsp;hervoragender Art und Weise umgesetzt&amp;nbsp;bzw. erweitert&amp;nbsp;und vor allem &lt;a accesskey="L" title ="zur Dokumentationsseite von www.urlrewriting.net" href ="http://www.urlrewriting.net/154/de/dokumentation.html"&gt;beschrieben&lt;/a&gt; haben. Damit war es m&amp;ouml;glich - ohne all zu tief in die Materie des Urlrewriting einsteigen zu m&amp;uuml;ssen - die einzelnen Seitenlinks suchmaschinenfreundlich zu gestalten.&lt;/p&gt; &lt;p&gt; &amp;nbsp;Ein weiterer Effekt, der sich dadurch ergeben hat, war die Sache mit dem AJAX. Durch einen einfachen Klickevent konnte ich den Linkklick so gestalten, dass - wenn Javascript aktiv ist - der Inhalt partiell &amp;uuml;ber AJAX (&lt;a accesskey="L" title ="zur Seite von www.ajaxpro.info" href="http://www.ajaxpro.info/"&gt;AJAX.PRO&lt;/a&gt;) und &lt;a accesskey="L" title ="zur Seite von www.jquery.com" href="http://www.jquery.com/"&gt;jQuery&lt;/a&gt; aktualisiert wird. In allen anderen F&amp;auml;llen, wird dann einfach der Get-Aufruf der verlinkten Adresse ausgef&amp;uuml;hrt.&lt;/p&gt; &lt;p&gt; Eine andere Herausforderung bestand in der Umsetzung der Barrierefreiheit. Hier war zun&amp;auml;chst die Frage nach einem WCAG-Validator, m&amp;ouml;chte man nicht am Ende selbst die Pr&amp;uuml;flisten abarbeiten. Ich habe mich dabei f&amp;uuml;r die Seite &lt;a accesskey="L" title ="zur Seite von www.liavaag.org" href ="http://www.liavaag.org/english/validate/"&gt; liavaag.org&lt;/a&gt; entschieden.&lt;/p&gt; &lt;p&gt; Unterm Strich muss ich sagen, war sicher einiges etwas nervig bei der Umsetzung der Barrierefreiheit (z.B. dass es nicht mehr ein einfacher "weiter..." - Link reicht, nein der Text muss f&amp;uuml;r alle Links verschieden sein. Oder dass fast jedes Element ein &lt;em&gt;tabindex&lt;/em&gt;-Attribute ben&amp;ouml;tigt.&amp;nbsp;Lustig wird die Sache , wenn man dann mit dynamischen Listen arbeitet.&lt;/p&gt; &lt;p&gt; Bei der Einhaltung der CSS-Standards war mir diesmal wichtig, dass von den Webdesignern ja immer wieder geforderte Umsetzen von Layout ohne Tabellen. In meiner t&amp;auml;glichen Arbeit erfahre ich dabei immer wieder, wie schnell man doch dabei ist und eine Tabelle nimmt, weil es sich doch damit so sch&amp;ouml;n alles anordnen l&amp;auml;sst. Ich muss zugeben, es ist schon manchmal ein ganz sch&amp;ouml;ner "Beinbruch" will man alles mit &lt;em&gt;div&lt;/em&gt;-Elementen umsetzen. Andererseits, h&amp;auml;lt man nur ein paar kleine Regeln ein, wie z.B. dass jedes div-Element, das floaten soll, auch bitte eine Breite zugewiesen bekommen muss, dann ist es am Ende fast nur halb so schwierig. Unverzichtbare Ressource dabei die Seite &lt;a accesskey="L" title ="zur Seite von http://www.css4you.de" href="http://www.css4you.de"&gt;css4you&lt;/a&gt;.&lt;/p&gt; &lt;p&gt; Am Ende kann ich nur jeden ermutigen, sich bei der Umsetzung von Webprojekten an die geltenden Standards zu orientieren - dann hat man es auch einfacher mit der Browserkompatibilit&amp;auml;t.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/0346129F-7535-4C76-90D6-C6E4BE929EC4/Barrierefrei%2c+W3C-Konform+und+andere+W%c3%bcnsche.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Mon, 27 Apr 2009 23:42:04 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.9269CFD1-F02E-4DEB-91F9-CC5F1729F187.content.aspx</guid><title>jQuery und der liebe Cache</title><description>&lt;p&gt;In einem aktuellen Projekt hat mich $.cache von &lt;a href="http://jquery.com/" &gt;jQuery&lt;/a&gt; schon so manches Mal zur Verzweiflung gebracht. Man hat sich gefreut, dass mit jQuery jetzt vieles einfacher und vor allem schneller geht. Als die Anwendung dann im Internet Explorer einige Zeit lief, folgte die Ernüchterung auf dem Fuße, was die Perfomance angeht. Letztlich war guter Rat gefragt und eine Lösung irgendwie nicht in Sicht.&lt;/p&gt;&lt;p&gt;Klar war, dass alle Events, die einmal gebunden wurden auch wieder mit unbind freigegeben werden müssen. Dennoch brachte es keine dauerhafte Verbesserung. Nach einiger Zeit des Debuggens kam mir das Objekt $.cache unter die Finger. Die Radikallösung &lt;/p&gt;&lt;p&gt;$.cache = {}&lt;/p&gt;&lt;p&gt;wird indes nicht empfohlen. Ich hab es dennoch ausprobiert - es ist in der Tat nicht empfehlenswert.&lt;br /&gt;Doch wie geht es weiter? Die Lösung war so nah vor Augen. Man braucht nur die leeren Objekte im $.cache - Objekt zu löschen. Also habe ich mir eine kleine Methode hierzu geschrieben, die dann auch bitte gleich das unbind der Events mit erledigt.&lt;/p&gt;&lt;p&gt;var clear$Cache = function(selector, events)&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;if (events) { $.each(function() { $(selector).unbind(events[i]); }) }&lt;br /&gt;&amp;nbsp;for (var n in $.cache) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var noElements = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var o = $.cache[n];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var z in o) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; noElements = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (noElements) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete $.cache[n];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;};&lt;/p&gt;&lt;p&gt;Die Methode übernimmt dabei zwei Argumente - zum einen den Selektor, der für den unbind-Aufruf erforderlich ist und zum anderen ein String-Array von Eventnamen.&lt;br /&gt;Im nächsten Schritt wird das $.cache-Objekt durchlaufen und immer wenn keine Eigenschaften zum Objekt vorhanden sind - es also leer ist - dann wird das betreffende Objekt gelöscht.&lt;/p&gt;&lt;p&gt;Statt des Aufrufes von &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("input, select").unbind("keyup").unbind("change");&lt;/p&gt;&lt;p&gt;nutze ich die o.g. Methode, &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clear$Cache("input, select", ["keyup","change"]);&lt;/p&gt;&lt;p&gt;da hier das jQuery-Cache-Objekt bereinigt wird - zum Vorteil der Webanwendung.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/9269CFD1-F02E-4DEB-91F9-CC5F1729F187/jQuery+und+der+liebe+Cache.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Fri, 24 Apr 2009 20:38:13 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.3B0958E0-D930-4F1D-B354-E0C55125013D.content.aspx</guid><title>Reguläre Ausdrücke</title><description>&lt;p&gt;Im &lt;a href="http://weblog.drescher-hackel.de/gu.cc1f4102-fb24-463f-a594-84552bd9780e.content.aspx" &gt;Artikel vom 18.04.2009&lt;/a&gt; hatte ich einen DHTML-Editor vorgestellt. So gut die dort genannte Lösung ist, so kommt man um kleinere individuelle Anpassungen und Erweiterungen nicht herum.Eine gute Hilfe sind hierbei Reguläre Ausdrücke.&lt;/p&gt;&lt;p&gt;Das Problem, das immer mal wieder auftaucht ist, dass der&amp;nbsp;im Editmode erzeugte HTML-Code oft nicht valide im Sinne des W3C ist. Entweder sind die Tags großgeschrieben, oder die Attribute erhalten Zuweisungen, ohne dass diese in Hochkommatas eingefasst werden. Vor diesem Problem stand ich unlängst.&lt;/p&gt;&lt;p&gt;Mit der folgenden Anweisung habe ich den HTML-Text durchsucht und die relevanten Passagen ersetzt.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Regex reg = new Regex(@"&amp;lt;/?[A-Za-z]+[^&amp;gt;]*&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MatchCollection mc = reg.Matches(htmlSource);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Match m in mc)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string value = m.Value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Regex reg2 = new Regex("[A-Za-z]+[=]{1}[\"\']?\\s?[A-Za-z0-9\\;\\.?\\:?/-]+\\s?[\"\']?");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MatchCollection mc2 = reg2.Matches(value);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (Match m2 in mc2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string value2 = m2.Value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] v = value2.Split('=');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value =&amp;nbsp; value.Replace(value2,string.Format("{0}=\"{1}\"", v[0], v[1].Replace("\"", "").Replace("'", "")));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; htmlSource = htmlSource.Replace(m.Value, value.ToLower());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;Der erste Ausdruck ermittelt dabei den HTML-Tag. Der zweite Ausdruck ermittelt alle Attribute innerhalb des HTML-Tags. Der Rest sind dann nur einfache Stringoperationen. &lt;/p&gt;&lt;p&gt;Es macht sich also bezahlt, sich hin und wieder mit Regulären Ausdrücken zu beschäftigen.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/3B0958E0-D930-4F1D-B354-E0C55125013D/Regul%c3%a4re+Ausdr%c3%bccke.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Mon, 20 Apr 2009 22:00:20 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.6E1DBDF9-AE61-4440-B504-5ADAC0C52FCB.content.aspx</guid><title>Texthighlight mit jQuery</title><description>&lt;p&gt;Johann Burkhard hat ein &lt;a title="zur Webseite von Johann Burkhard"  href="http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html"&gt;interessantes jQuery-Plugin entwickelt&lt;/a&gt;&amp;nbsp;und unter der MIT-License ver&amp;ouml;ffentlicht, mit dem es m&amp;ouml;glich ist, bestimmte Textpassagen farblich hervorzuheben. Anwendungsgebiete gibt es hierzu reichlich, ich denke dabei nur an die Suchfunktion auf einer Webseite. H&amp;auml;ufig werden mehrere Fundstellen zur formulierten Suchanfrage ausgeben, doch verliert man den &amp;Uuml;berblick und bei mancher Fundstelle fragt man sich, "was hatte das mit meiner Anfrage zu tun gehabt". In solchen F&amp;auml;llen ist es hilfreich f&amp;uuml;r den Suchenden, wenn seine Anfrage in der Fundstelle farblich hervorgehoben wird.&lt;/p&gt;&lt;p&gt;Die Implementierung ist dabei - wie fast immer bei jQuery-Plugins - denkbar einfach:&lt;/p&gt;&lt;p&gt;Man&amp;nbsp;f&amp;uuml;gt zun&amp;auml;chst die Javascriptdatei seinem Projekt und resp. seiner Webseite hinzu. Dann erfolgt die Auswahl des Containers innerhalb dessen die Textmarkierung erfolgen soll. Auf diese&amp;nbsp;Auswahl ruft man die Methode &amp;nbsp;&lt;em&gt;highlight&lt;/em&gt; auf und &amp;uuml;ber gibt den zu markierenden Text als Argument.&lt;/p&gt;&lt;p&gt;Ich habe dieses Plugin in diesem Blog implementiert. Wer also die praktische Seite sich ansehen m&amp;ouml;chte, benutze hier einfach die Suche.&lt;/p&gt;&lt;p&gt;Einzig im Plugin habe ich eine kleine Erg&amp;auml;nzung vornehmen m&amp;uuml;ssen, n&amp;auml;mlich wenn ein Leerstring als Argument &amp;uuml;bergeben wird. F&amp;uuml;r diesen Fall muss die Methode verlassen werden. So habe ich im Plugin folgende Zeile hinzugef&amp;uuml;gt:&lt;/p&gt;&lt;p&gt;jQuery.fn.highlight = function(pat) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pat == "") { return this; }&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Und zu guter Letzt: es funktioniert in allen Browsern, die jQuery unterst&amp;uuml;tzen. &lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/6E1DBDF9-AE61-4440-B504-5ADAC0C52FCB/Texthighlight+mit+jQuery.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 19 Apr 2009 23:26:32 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.A9E9612A-717B-40F1-A336-DBC946AFBE01.content.aspx</guid><title>jQuery 1.3 Cheat Sheet </title><description>&lt;p&gt; &lt;a href="http://www.aspnetzone.de/blogs/juergengutsch/archive/2009/04/16/jquery-1-3-cheat-sheet.aspx" title="zum Beitrag des J&amp;uuml;rgen Gutsch" &gt; J&amp;uuml;rgen Gutsch&lt;/a&gt; hat mich mal wieder auf dem Laufenden gehalten. Es ist halt immer wieder gut, das eine oder andere Weblog regelm&amp;auml;&amp;szlig;ig zu lesen.&lt;/p&gt; &lt;p&gt; So hat&amp;nbsp;sich wieder einmal&amp;nbsp;jemand die M&amp;uuml;he gemacht und einen kleinen &lt;a href="http://acodingfool.typepad.com/blog/2009/01/jquery-13-cheat-sheet.html" title="zum Cheat Sheet" &gt;2 Seiten umfassenden Spickzettel&lt;/a&gt; zum &lt;a href="http://www.jquery.com" title="zur jQuery Seite" &gt;jQuery 1.3&lt;/a&gt; verfasst. Interessant ist dabei, &lt;a href="http://acodingfool.typepad.com/blog/cheat-sheets.html" title="zur Cheat Sheet &amp;Uuml;bersicht" &gt; welche &amp;Uuml;bersichten noch verf&amp;uuml;gbar&lt;/a&gt; sind. &lt;/p&gt; &lt;p&gt; F&amp;uuml;r die t&amp;auml;gliche Arbeit sind diese Cheat Sheets immer wieder eine gute Hilfe. &lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/A9E9612A-717B-40F1-A336-DBC946AFBE01/jQuery+1.3+Cheat+Sheet+.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 18 Apr 2009 21:36:13 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.CC1F4102-FB24-463F-A594-84552BD9780E.content.aspx</guid><title>DHTML Editor einmal anders</title><description> &lt;p&gt; Die ganzen Tage hatte mich geplagt, dass ich noch keine gescheite Oberfläche hatte, um den Weblog zu bedienen, sprich Einträge hinzuzufügen, zu editieren oder gar zu löschen. Sicher gibt es DHTML Editoren auf Webbasis (hab mir sogar eine Lizenz gekauft gehabt), so richtig konnte ich das ganze nicht so nutzen, wie ich es mir vorgestellt hatte.&lt;/p&gt; &lt;p&gt; Also dachte ich mir, es muss doch was machbar sein im Rahmen einer Windows-Applikation. &lt;a href="http://www.codeproject.com/" &gt;Codeproject&lt;/a&gt; gehört dabei bei mir seit Jahren mit zur ersten Anlaufstelle, denn fast alles, was einem heute so in den Kopf kommt, wurde auf dieser Welt schon einmal gedacht, entworfen, entwickelt, etc. Also warum sollte man das Rad stets neu erfinden.&lt;/p&gt; &lt;p&gt; Und in der Tat gab es einige Fundstellen, wobei mir &lt;a href="http://www.codeproject.com/KB/cs/HtmlEditor.aspx" &gt; diese&lt;/a&gt; am meisten zusagte. Sie ist verständlich aufgebaut, erweiterbar und in C# geschrieben - alles, was ich gesucht hatte.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/CC1F4102-FB24-463F-A594-84552BD9780E/DHTML+Editor+einmal+anders.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 18 Apr 2009 21:16:00 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.2B04AAC1-FD1C-4EA9-B78F-627FBA2329BD.content.aspx</guid><title>jQuery - Praktischer Einsatz (1)</title><description> &lt;p&gt; Ich muss zugestehen, es ist nicht jQuery, das es möglich macht, sondern eher das Verständnis für Javascript. Ich muss schon des öfteren Schmunzeln, wenn ich lese &amp;quot;viel clientseitige Funktionalität, aber bitte ohne Javascript&amp;quot;. Ich hab keine Ahnung, wer sich das ausdenkt, doch gehört Javascript heute zur Webanwendung, wie die Butter zum Brot.&lt;br /&gt; &lt;br /&gt; Michael Schwarz hat in &lt;a href="http://michael-schwarz.blogspot.com/2009/01/jquery-tipp-1-bind-verbessern.html"&gt; seinem Blog&lt;/a&gt; zB. eine Möglichkeit aufgezeigt, wie einfach und praktisch man clientseitige Events (besser) verwalten kann.&lt;br /&gt; &lt;br /&gt; Hierzu wird der Event nicht auf dem einzenlen Element registriert, sondern auf dem &amp;quot;Mutterelement&amp;quot;. Der Rest läst sich einfach dann ermitteln. Einzigst die Eigenschaft &lt;i&gt;srcElement&lt;/i&gt; wird offenbar im jQuery nicht ganz konsquent durchgesetzt. So führt deren Verwendung mit dem Netscape-Browser zu einem Scriptfehler. Ich habe mich daher auf die &lt;i&gt;target&lt;/i&gt; Eigenschaft festgelegt, welche bislang in allen Browsern fehlerfrei interpretiert wurde. Ein weiterer Vorteil liegt letztlich auch in der Administration und Wartbarkeit der Events. &lt;br /&gt; &lt;br /&gt; Angeregt von Michael s Beitrag, hab ich mich die Tage mit einem &amp;quot;WebControl&amp;quot; beschäftigt, was an sich keines ist, da es nahezu vollständig über Javascript realisiert wird. Ausgangssituation ist hier ein &lt;a href="http://www.json.org/" accesskey="L"&gt; JSON&lt;/a&gt;-String.&lt;/p&gt; &lt;pre&gt; &amp;lt;script type=&amp;#39;javascript&amp;#39; &amp;gt;&lt;br /&gt; var daten = {&lt;br /&gt; Elements : [&lt;br /&gt; { Name : &amp;quot;Element 1&amp;quot;, Elements : [ &amp;quot;E1 Wert 1&amp;quot;,&amp;quot;E1 Wert 2&amp;quot;,&amp;quot;E1 Wert 3&amp;quot;,&amp;quot;E1 Wert 4&amp;quot; ] },&lt;br /&gt; { Name : &amp;quot;Element 2&amp;quot;, Elements : [ &amp;quot;E2 Wert 1&amp;quot;,&amp;quot;E2 Wert 2&amp;quot;,&amp;quot;E2 Wert 3&amp;quot;,&amp;quot;E2 Wert 4&amp;quot; ] },&lt;br /&gt; { Name : &amp;quot;Element 3&amp;quot;, Elements : [ &amp;quot;E3 Wert 1&amp;quot;,&amp;quot;E3 Wert 2&amp;quot;,&amp;quot;E3 Wert 3&amp;quot;,&amp;quot;E3 Wert 4&amp;quot; ] }&lt;br /&gt; ]&lt;br /&gt; };&lt;br /&gt; &amp;lt;\script&amp;gt;&lt;br /&gt; &lt;/pre&gt; &lt;p&gt; Um das ganze dann auch ausgeben zu können, kann man das Object &lt;i&gt;daten &lt;/i&gt;um eine Methode, die ich mal&lt;i&gt; getTree &lt;/i&gt;genannt habe, erweitern. &lt;br /&gt; &lt;br /&gt; Hierbei prüft man gescheiterweise, ob man nicht schon einmal die ganze Arbeit des Rendern geleistet hat. Daher ist es ratsam, das treeView-Element vorher zu selektieren und dann gegebenenfalls z.B. nur einzublenden. Ist das &amp;quot;Grundgerüst&amp;quot; noch nicht am Server vorhanden, erstellt man es und bindet zugleich den &amp;quot;einzigen&amp;quot; Click-Eventhandler an das Object.&lt;/p&gt; &lt;pre&gt; var div = $("&amp;lt;div id='treeView' &amp;gt;&amp;lt;div id='treeViewContent' /&amp;gt;&amp;lt;/div&amp;gt;") &lt;/pre&gt; &lt;br /&gt; &lt;br /&gt; Im Click-Eventhandler ermittelt man dann u.a. mit der vom Michael Schawrz veröffentlichten Methode das eigentliche Eventelement und nimmt die weitere Verarbeitung vor, in diesem Fall, das Rendern und Anzeigen der Unterknoten. &lt;br /&gt; &lt;br /&gt; &lt;pre&gt; .bind("click", function(ev) {&lt;br /&gt; var ele = $(ev.target);&lt;br /&gt; var e = findParent(ele, "div[:parent=#treeViewContent]", 9);&lt;br /&gt; var name = e.find("a").text();&lt;br /&gt; &lt;br /&gt; if (e.attr("name") != undefined&lt;br /&gt; &amp;amp;&amp;amp; e.attr("name") == "subNode") {&lt;br /&gt; //mach was...&lt;br /&gt; return false;&lt;br /&gt; } else if (e.parent().attr("id") == "treeViewContent") {&lt;br /&gt; var img = e.find("img");&lt;br /&gt; var subNode = $("#sub" + name); if (img.attr("src").endWidth("plusnode.png")) {&lt;br /&gt; img.attr("src", "images/minusnode.png");&lt;br /&gt; e.toggleClass("parentNodeSelect");&lt;br /&gt; var o = json.Elements.getByName(name);&lt;br /&gt; if (subNode.length == 0) {&lt;br /&gt; var sub = $("&amp;lt;div style='clear:both; width:auto;' id='sub" + name + "' /&amp;gt;")&lt;br /&gt; .css({ overflow: "hidden" });&lt;br /&gt; var on = o.Elements.length;&lt;br /&gt; for (var s = 0; s &amp;lt; on; s++) {&lt;br /&gt; var _s = $("&amp;lt;div class='treeNode' name='subNode' &amp;gt;&amp;lt;a&amp;gt;" + o.Elements[s] + "&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;");&lt;br /&gt; _s.appendTo(sub);&lt;br /&gt; }&lt;br /&gt; sub.insertAfter(e);&lt;br /&gt; } else {&lt;br /&gt; subNode.show();&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; else {&lt;br /&gt; img.attr("src", "images/plusnode.png");&lt;br /&gt; e.toggleClass("parentNodeSelect");&lt;br /&gt; subNode.hide();&lt;br /&gt; }&lt;br /&gt; } else {&lt;br /&gt; return false;&lt;br /&gt; }&lt;br /&gt; });&lt;br /&gt; &lt;/pre&gt; &lt;br /&gt; &lt;br /&gt; Hat man alles richtig gemacht, erhält man folgende Anzeige:&lt;br /&gt; &lt;br /&gt; &lt;img alt="Treeview Sample" src="/images/Treeview.png" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;p&gt; Dies Sample lässt viele Möglichkeiten offen. In einem aktuellen Projekt habe ich so zum Beispiel dies als Grundlage dafür genommen, um in einer Client-Server-Kommunikation ganz auf das Update-Panel zu verzichten. Was soll ich sagen, es funktioniert. &lt;br /&gt; &lt;br /&gt; Ebenso kann man dieses Sample dahin erweitern, dass man z.B. Tabellenansichten umsetzt oder gar eine Filterfunktion für die Treeview-Selektion implementiert. &lt;br /&gt; &lt;br /&gt; Interessant ist hierbei der Einsatz von &lt;a href="http://www.hugoware.net/jLINQ" accesskey="L" title="jLINQ"&gt;jLINQ&lt;/a&gt;. jLINQ ist dabei eine interessante jQuery-Implementierung von &lt;a href="http://msdn.microsoft.com/en-us/library/bb308959.aspx" accesskey="L" title=".NET LINQ"&gt;.NET LINQ&lt;/a&gt; im Javascript-Umfeld. Als Datenbasis dient ein Array von Objekten, auf die dann die Afrage ausgeführt werden kann.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/2B04AAC1-FD1C-4EA9-B78F-627FBA2329BD/jQuery+-+Praktischer+Einsatz+(1).content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Wed, 01 Apr 2009 22:54:04 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.647F387D-0F94-4054-8B2A-E6A9AA4BEC9E.content.aspx</guid><title>Mit Javascript Zahlen mit Tausender Trennzeichen</title><description>&lt;p&gt; Wie kann man mit Javascript Zahlenwerte in einer Textbox (input-Element)&amp;nbsp;so formatieren, dass sie mit einem Tausender-Trennpunkt angezeigt werden?&lt;br /&gt; &lt;br /&gt; Hierzu kann man sich eine prototype-Methode zum String-Objekt schreiben.&lt;br /&gt; &lt;br /&gt; Der Ansatz ist recht einfach eigentlich - man zerlegt einfach den String immer wieder in 3 Zeichen große Teile und legt diese in einem Array ab. Anschließend&amp;nbsp;rollt man das Array von hinten auf, macht noch zwei Ersetzungen und fertig ist es.&lt;br /&gt; &lt;br /&gt; String.prototype.toLocaleFormat = function() {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; var n = this; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ns = String(n).replace('.', ',');&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; var w = [];&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; while (ns.length &amp;gt; 0) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var a = ns.length;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (a &amp;gt;= 3) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s = ns.substr(a - 3);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns = ns.substr(0, a - 3);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s = ns;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns = "";&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; w.push(s);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (i = w.length - 1; i &amp;gt;= 0; i--) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ns += w[i] + ".";&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ns = ns.substr(0, ns.length - 1);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; return ns.replace(/\.,/, ',');&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &amp;nbsp;&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/647F387D-0F94-4054-8B2A-E6A9AA4BEC9E/Mit+Javascript+Zahlen+mit+Tausender+Trennzeichen.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Tue, 10 Mar 2009 13:33:02 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.9B8AC0D9-58F6-40A5-B579-A450CC56B046.content.aspx</guid><title>MSDN Premium mit Visual Studio abzugeben</title><description> &lt;p&gt; Wer es noch nicht hat, für den ist es eine interessante Möglichkeit.&lt;br /&gt; Michael Schwarz hat über &lt;a title="Verlosung MSDN Premium" href="http://michael-schwarz.blogspot.com/2009/02/msdn-premium-mit-visual-studio.html" accesskey="L"&gt;seinen Weblog&lt;/a&gt; eine MSDN Premium abzugeben.&lt;br /&gt; &lt;br /&gt; Na dann viel Glück ;-)&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/9B8AC0D9-58F6-40A5-B579-A450CC56B046/MSDN+Premium+mit+Visual+Studio+abzugeben.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 28 Feb 2009 22:27:18 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.6AA94AD3-3C5D-4086-9ED5-57931A6A7766.content.aspx</guid><title>Ein neuer Anfang</title><description>&lt;p&gt;So langsam geht es der Fertigstellung des neuen Weblogs entgegen. Durch eine Unachtamkeit beim Öffnen der Webseite mit dem Visual Studio 2008 hatte ich versehentlich meinen eingerichteten Weblog mit einem Mouse-Click gewissermaßen "abgeschaltet".&lt;/p&gt;&lt;p&gt;Nun dachte ich, nicht so schlimm - aktualisiere ich ebend auf die neuste Version von &lt;a href="http://dasblog.info/" &gt;dasblog&lt;/a&gt;. Aber - zu früh gefreut. Aufgrund der doch &lt;span style="text-decoration: line-through"&gt;eigenwilligen&lt;/span&gt; anderen Sicherheitskonfigurationen von dasblog kann ich es im Medium-Trust Umfeld des Hosters so nicht betreiben. &lt;/p&gt;&lt;p&gt;Also habe ich mir die Content-XML-Datei gesichert und eine eigene Anwendung geschrieben. Die bisherigen Inhalte werde ich dann nach und nach wieder einspielen.&lt;/p&gt;&lt;p&gt;Also dann - wieder viel Spaß beim Lesen... ;-)&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/6AA94AD3-3C5D-4086-9ED5-57931A6A7766/Ein+neuer+Anfang.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sat, 28 Feb 2009 12:43:02 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.B8EE6409-C85C-417C-909D-95CA21A54578.content.aspx</guid><title>Der Weg zum WYSIWYG - Editor</title><description>&lt;p&gt; Immer häufiger lese ich im Netz, dass die Anforderungen an WYSIWYG Editoren immer öfter von den&lt;br /&gt; vorhandenen Standardlösungen nicht bedient werden können. Hier hilft letztlich nur noch, den &lt;br /&gt; bestehenden Editor seiner Wahl im Rahmen der bestehenden Lizenzbedingungen anzupassen oder gleich &lt;br /&gt; selbst sich einen Editor zu erstellen, der genau diesen Anforderungen genügt. &lt;br /&gt; &lt;br /&gt; Unerlässlich ist dabei jedoch die Bereitschaft, sich mit den Möglichkeiten von Javascript in seiner &lt;br /&gt; Webanwendung vertraut zu machen. Als wichtige Referenz sollte man zudem folgende Adresse im Auge &lt;br /&gt; behalten: &lt;a title="http://msdn.microsoft.com/en-us/library/ms533049(VS.85).aspx" href="http://msdn.microsoft.com/en-us/library/ms533049(VS.85).aspx"&gt;&lt;strong&gt;http://msdn.microsoft.com/en-us/library/ms533049(VS.85).aspx &lt;/strong&gt;&lt;/a&gt; &lt;br /&gt; &lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/B8EE6409-C85C-417C-909D-95CA21A54578/Der+Weg+zum+WYSIWYG+-+Editor.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Mon, 29 Dec 2008 23:06:16 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.B4C1DF90-A475-4843-BA10-E36161B07FB6.content.aspx</guid><title>jQuery-Ansatz für transparente PNG Grafiken im Internet Explorer 6</title><description> &lt;p&gt; Im &lt;a title="Png-Transparenz im IE 6" href="http://weblog.drescher-hackel.de/gu.5D5C698A-A701-40A5-A391-43275C5B8DB8.content.aspx" accesskey="L"&gt;Blog-Beitrag&lt;/a&gt; hatte ich einen jQuery-Ansatz aufgezeigt, wie man PNG-Grafiken im Internet Explorer &amp;lt; 7 transparent darstellen kann. Möglich wurde dies durch die Unterstützung des filter-Attributes.&lt;br /&gt; Doch wie sieht das ganze aus, wenn man PNG-Hintergrundgrafiken einsetzt und diese zB einen transparenten Verlauf haben.&lt;br /&gt; Hier könnte man wieder die scriptseitige Implementierung wählen:&lt;br /&gt; &amp;nbsp;&lt;br /&gt; &amp;lt;script type="text/javascript"&amp;gt; &lt;br /&gt; &amp;nbsp;$(document).ready(function() { &lt;br /&gt; &amp;nbsp;&amp;nbsp;if ($.browser.msie) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;$(".transpPNG").each(function() { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;var img = this.currentStyle.backgroundImage.substr(5).replace("\")", ""); &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;$(this).css({ background: "none", &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+img+"', sizingMethod='scale')" });&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}); &lt;br /&gt; &amp;nbsp;} &lt;br /&gt; } ); &lt;br /&gt; &amp;lt;/script&amp;gt;&lt;/p&gt; &lt;p&gt; Hier wurde eine Selektion auf alle DIV-Elemente mit dem class-Attribute "transpPNG" vorgenommen und die filter-Eigenschaft gesetzt. Wichtig zu wissen ist dabei, dass die background-Eigenschaft auf 'none' gesetzt werden muss. Die Bild-Url wird dabei aus den aktuellen Css-Definitionen ermittelt. &lt;br /&gt; Als jQuery-Erweiterung ergäbe sich dann folgender Code:&lt;br /&gt; &lt;br /&gt; &amp;nbsp;&amp;lt;script type="text/javascript"&amp;gt;&amp;nbsp;&lt;br /&gt; &lt;br /&gt; &amp;nbsp;$(document).ready(function() { &lt;br /&gt; &amp;nbsp;if ($.browser.msie) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;$(".transpPNG").setTransparentBackground(); } &lt;br /&gt; &amp;nbsp;}); &lt;/p&gt; &lt;p&gt; $.fn.setTransparentBackground = function() { &lt;br /&gt; &amp;nbsp;return this.each(function() { &lt;br /&gt; &amp;nbsp;&amp;nbsp;var img = this.currentStyle.backgroundImage.substr(5).replace("\")", ""); &lt;br /&gt; &amp;nbsp;&amp;nbsp;$(this).css({ background: "none", &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+img+"', sizingMethod='scale')" &lt;br /&gt; &amp;nbsp;&amp;nbsp;}); &lt;br /&gt; &amp;nbsp;}); &lt;br /&gt; } &lt;br /&gt; &amp;lt;/script&amp;gt;&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/B4C1DF90-A475-4843-BA10-E36161B07FB6/jQuery-Ansatz+f%c3%bcr+transparente+PNG+Grafiken+im+Internet+Explorer+6.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Wed, 10 Dec 2008 20:48:18 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.42D3EDB0-B7AD-4A84-8CBF-606F64B209DB.content.aspx</guid><title>Drucken mit jQuery</title><description> &lt;p&gt; Drucken von Webseiteninhalten ist immer ein zweischneidiges Schwert. Oftmals möchte man nur bestimmte Bereiche der Seite nur drucken.&lt;/p&gt; &lt;p&gt; Das jQuery Plugin PrintArea bietet hier einen interessanten Ansatz. Hier wird über ein nicht sichtbares IFrame der selektierte Content der Webseite ausgedruckt.&lt;br /&gt; Wenn man sich dann noch bei macht und innerhalb des Plugins das jQuery - Konzept verfolgt, erhält man dann folgende Erweiterung, die das Ausdrucken von Teilbereichen der Webseite deutlich vereinfacht.&lt;/p&gt; &lt;p&gt; $.fn.printArea = function() {&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var ele = $(this);&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var counter = 0;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$("iframe[@id^='printArea']").remove();&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this.each(function(e) {&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;counter++;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var iframe = $('&amp;lt;iframe /&amp;gt;') .css({&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;position: 'absolute',&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width: '0px',&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height: '0px',&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left: '-500px',&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;top: '-500px' })&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.attr('id', "printArea_" + counter)&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.appendTo($("body")); &lt;br /&gt; &amp;nbsp;&amp;nbsp;var doc = iframe.get(0).contentWindow.document; &lt;br /&gt; &amp;nbsp;&amp;nbsp;$("link").each(function(e) { &lt;br /&gt; &amp;nbsp;&amp;nbsp;if (this.rel.toLowerCase() == 'stylesheet') &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;doc.write('&amp;lt;link type="text/css" rel="stylesheet" href="' + this.href + '"&amp;gt;&amp;lt;/link&amp;gt;'); &lt;br /&gt; &amp;nbsp;&amp;nbsp;});&lt;br /&gt; &amp;nbsp;&lt;br /&gt; &amp;nbsp;doc.write('&amp;lt;div class="' + ele.attr("class") + '"&amp;gt;' + ele.html() + '&amp;lt;/div&amp;gt;'); &lt;br /&gt; &amp;nbsp;doc.close(); &lt;br /&gt; &amp;nbsp;$(doc.body).css({ backgroundColor: '#fff' });&lt;br /&gt; &amp;nbsp;&amp;nbsp;iframe.get(0).contentWindow.focus(); &lt;br /&gt; &amp;nbsp;setTimeout(function() { iframe.get(0).contentWindow.print(); }, 10);&lt;br /&gt; &amp;nbsp;}); }&lt;/p&gt; &lt;p&gt; &lt;br /&gt; Zunächst werden bei jedem Aufruf alle im DOM noch vorhandenen IFrames, deren ID-Attribute mit printArea beginnt, aus dem DOM entfernt.&lt;/p&gt; &lt;p&gt; $("iframe[@id^='printArea']").remove(); &lt;/p&gt; &lt;p&gt; &lt;br /&gt; Im nächsten Schritt werden für alle auf der Selektion gefundenen Bereiche jeweils ein separates IFrame erzeugt und dem Body-Element hinzugefügt.&lt;/p&gt; &lt;p&gt; &amp;nbsp;var iframe = $('&amp;lt;iframe /&amp;gt;') .css({ position: 'absolute', width: '0px', height: '0px', left: '-500px', top: '-500px' }) .attr('id', "printArea_" + counter) .appendTo($("body"));&lt;/p&gt; &lt;p&gt; &lt;br /&gt; Über den Eingangs definierten Counter erhält jedes IFrame dabei seine eindeutige ID. Im nächsten Schritt wird dann das CSS der Basisseite übernommen in das Document des IFrames.&lt;/p&gt; &lt;p&gt; var doc = iframe.get(0).contentWindow.document; $("link").each(function(e) { if (this.rel.toLowerCase() == 'stylesheet') doc.write('&amp;lt;link type="text/css" rel="stylesheet" href="' + this.href + '"&amp;gt;&amp;lt;/link&amp;gt;'); });&lt;/p&gt; &lt;p&gt; &lt;br /&gt; Anschließend muss noch der Inhalt des selektierten Bereiches im IFrame platziert werden, was die folgenden Zeilen übernehmen:&lt;/p&gt; &lt;p&gt; doc.write('&amp;lt;div class="' + ele.attr("class") + '"&amp;gt;' + ele.html() + '&amp;lt;/div&amp;gt;'); doc.close(); &lt;/p&gt; &lt;p&gt; &lt;br /&gt; Zum Schluss erhält das aktuelle IFrame den Focus und der Druck-Dialog beim Client wird aufgerufen, wobei der Timeout für den Opera-Browser sich von Vorteil erwies.&lt;/p&gt; &lt;p&gt; iframe.get(0).contentWindow.focus(); setTimeout(function() { iframe.get(0).contentWindow.print(); }, 10);&lt;/p&gt; &lt;p&gt; &amp;nbsp;&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/42D3EDB0-B7AD-4A84-8CBF-606F64B209DB/Drucken+mit+jQuery.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Fri, 26 Sep 2008 22:20:14 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.236EAA3C-7C92-4248-BD2C-17A0CAA73FCF.content.aspx</guid><title>Disabled / Checked-Attribute mit jQuery setzen</title><description>&lt;p&gt; Es gibt wohl kaum etwas, was sich mit jQuery nicht umsetzen läßt. So las ich die Tage, dass immer wieder Anfragen über eine große Suchmaschine gestellt wurden, wo nach einer Lösung gesucht wurde, wie man das disabled bzw. checked Attribute mit jQuery setzt. &lt;/p&gt; &lt;p&gt; Beide Attribute sind eigentlich ja mit einem boolschen Wert behaftet - entweder eine Element ist disabled oder nicht, es gibt also nur ein ja oder nein bzw. ein true oder false. Dem wird jQuery in einer Implementierung auch gerecht.&lt;/p&gt; &lt;p&gt; Für die folgenden HTML-Elemente &lt;/p&gt; &lt;p&gt; &amp;lt;input type="text" value="Hallo" id="webInput" /&amp;gt; &amp;lt;input type="button" value="Hallo" id="webButton" /&amp;gt; &amp;lt;input type="checkbox" id="webCheckbox" /&amp;gt;&lt;/p&gt; &lt;p&gt; &lt;br /&gt; würde die jQuery-Umsetzung folgendermaßen aussehen:&lt;/p&gt; &lt;p&gt; $("#webInput").attr("disabled", true); $("#webButton").attr("disabled", true); $("#webCheckbox").attr("checked", true);&lt;/p&gt; &lt;p&gt; &lt;br /&gt; Folgt man der &lt;a title="jQuery Dokumentation" href="http://docs.jquery.com/Attributes/attr#keyvalue" accesskey="L"&gt;jQuery-Dokumentation&lt;/a&gt;, so kann aber auch folgende Lösung gesetzt werden:&lt;/p&gt; &lt;p&gt; $("#webInput").attr("disabled", "disabled"); $("#webButton").attr("disabled", "disabled"); $("#webCheckbox").attr("checked", "checked");&lt;/p&gt; &lt;p&gt; &lt;br /&gt; Möchte man den Attributwert jedoch genau umkehren, so bliebe bei der letztgenannten Lösung nur &lt;a title="jQuery Remove Attribute" href="http://docs.jquery.com/Attributes/removeAttr#name" accesskey="L"&gt;removeAttr&lt;/a&gt;, im erstgenannten Fall der Attributewert false zu setzen.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/236EAA3C-7C92-4248-BD2C-17A0CAA73FCF/Disabled+%2f+Checked-Attribute+mit+jQuery+setzen.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Mon, 22 Sep 2008 22:26:02 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.5D5C698A-A701-40A5-A391-43275C5B8DB8.content.aspx</guid><title>jQuery-Ansatz für transparente PNG Grafiken im Internet Explorer 6</title><description> &lt;p&gt; Wenn man PNG-Grafiken im Internet einsetzt, dann kommt man insbesondere beim Internet Explorer 6 an einem Problem an, nämlich dass dieser Browser die Transparenz der PNG-Grafiken nicht richtig darstellen kann.&lt;br /&gt; Zur Lösung dieses Problems gibt es im Netz schon diverse Lösungen, wobei mir diese hier am meisten zusagt. Leider berücksichtigt diese Lösung nicht alle Attribute des Bildelementes und auch nicht mögliche Events.&lt;br /&gt; Zu guter Letzt bleibt der Ansatz, den jQuery verfolgt hier unberücksichtigt. Der folgende Codeausschnitt nimmt sich diesem Problem an: &lt;br /&gt; &lt;br /&gt; &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; $(document).ready(function(e){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("img[src$='png']").each(function(e){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!$.browser.msie){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(parseInt($.browser.version) != 6){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var div = $("&amp;lt;div /&amp;gt;");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(var n in this.attributes){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this[n] != "" &amp;amp;&amp;amp; this[n] != null){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(n.substr(0,2)=="on"){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.bind(n.substr(2), this[n]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(n !=&amp;nbsp; "src"){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.attr(n, this[n]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.attr("style", this.style.cssText);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.css({&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width&amp;nbsp;&amp;nbsp; : this.width + "px",&lt;/p&gt; &lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height&amp;nbsp; : this.height + "px",&lt;/p&gt; &lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter&amp;nbsp; : "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "', sizingMethod='scale')"&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/p&gt; &lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this.align == "left"){ div.css("float", "left"); }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this.align == "right"){ div.css("float", "right"); }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this.parentNode.href){ div.css("cursor", "hand"); }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.parentNode.replaceChild( div[0], this );&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/p&gt; &lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }); &lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt; &lt;br /&gt; Das ganze kann man natürlich als jQuery - Erweiterung implementieren, so dass der Code sich dann ändert in:&lt;br /&gt; &lt;br /&gt; &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; jQuery.fn.setPNGTransparenz4IE6 = function(){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.each(function(e){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!$.browser.msie){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(parseInt($.browser.version) != 6){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var div = $("&amp;lt;div /&amp;gt;");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(var n in this.attributes){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this[n] != "" &amp;amp;&amp;amp; this[n] != null){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(n.substr(0,2)=="on"){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.bind(n.substr(2), this[n]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if(n != "src"){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.attr(n, this[n]);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.attr("style", this.style.cssText);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div.css({&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; width&amp;nbsp;&amp;nbsp;: this.width + "px",&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height&amp;nbsp;&amp;nbsp;: this.height + "px",&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter&amp;nbsp; : "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "', sizingMethod='scale')"&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this.align == "left"){ div.css("float", "left"); }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this.align == "right"){ div.css("float", "right"); }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(this.parentNode.href){ div.css("cursor", "hand"); }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.parentNode.replaceChild( div[0], this );&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; $(document).ready(function(e){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; $("img[src$='png']").setPNGTransparenz4IE6();&lt;br /&gt; });&lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt; &lt;br /&gt; Es hat sich nicht viel geändert am Code - die Auswahlabfrage auf alle Bilder die in der Dateierweiterung auf *.png enden findet jetzt außerhalb statt.&lt;br /&gt; Auf diese Auswahl wird dann die Erweiterungsmethode setPNGTransparenz4IE6 aufgerufen. &lt;br /&gt; &lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/5D5C698A-A701-40A5-A391-43275C5B8DB8/jQuery-Ansatz+f%c3%bcr+transparente+PNG+Grafiken+im+Internet+Explorer+6.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 13 Jul 2008 19:30:55 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.BC1A4D74-60FB-455B-9797-231450351E9B.content.aspx</guid><title>Eventsource bei serverseitiger Eventregistrierung </title><description>&lt;p&gt;Wenn man zB. an einem HtmlTable-Objekt serverseitig das onclick-Attribute setzt, so hat man wieder clientseitig das Problem, dass bei manchen Browsern der Eventparameter null bzw undefined ist. Eine Lösung könnte darin bestehen, dass man bei der serverseitigen Festlegung des Attributes das Objekt this mit an die Clientmehtode übergibt.&lt;/p&gt;&lt;p&gt;Das folgende Beispiel setzt ein onclick-Attribut auf ein HTML-Tabelle-Objekt.&lt;/p&gt;&lt;p&gt;ASPX Seite:&lt;/p&gt;&lt;br /&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LoadUserControl.aspx.cs" Inherits="M2Office.Web.TestSeiten.LoadUserControl" %&amp;gt; &lt;br /&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; &lt;br /&gt;&amp;lt;head runat="server"&amp;gt; &lt;br /&gt;&amp;lt;title&amp;gt;EventTest&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&amp;lt;form id="form1" runat="server"&amp;gt; &lt;br /&gt;&amp;lt;asp:RadioButtonList ID="RadioButtonList1" runat="server"&amp;gt; &lt;br /&gt;&amp;lt;asp:ListItem Text="Test1" Value="test1" /&amp;gt; &lt;br /&gt;&amp;lt;asp:ListItem Text="Test2" Value="test2" /&amp;gt; &lt;br /&gt;&amp;lt;asp:ListItem Text="Test3" Value="test3" /&amp;gt; &lt;br /&gt;&amp;lt;/asp:RadioButtonList&amp;gt; &lt;br /&gt;&amp;lt;asp:Table ID="Table1" runat="server"&amp;gt; &lt;br /&gt;&amp;lt;asp:TableRow ID="TableRow1" runat="server" TableSection="TableBody"&amp;gt; &lt;br /&gt;&amp;lt;asp:TableCell ID="TableCell1" runat="server" Text="Test1 0" /&amp;gt; &lt;br /&gt;&amp;lt;asp:TableCell ID="TableCell2" runat="server" Text="Test2 0" /&amp;gt; &lt;br /&gt;&amp;lt;asp:TableCell ID="TableCell3" runat="server" Text="Test3 0" /&amp;gt; &lt;br /&gt;&amp;lt;/asp:TableRow&amp;gt; &lt;br /&gt;&amp;lt;asp:TableRow ID="TableRow2" runat="server" TableSection="TableBody"&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;asp:TableCell ID="TableCell4" runat="server" Text="Test1 1" /&amp;gt; &lt;br /&gt;&amp;lt;asp:TableCell ID="TableCell5" runat="server"&amp;gt; &lt;br /&gt;&amp;lt;asp:TextBox ID="TextBox1" runat="server" Text="Text in Textbox" /&amp;gt; &lt;br /&gt;&amp;lt;/asp:TableCell&amp;gt; &amp;lt;asp:TableCell ID="TableCell6" runat="server" Text="Test3 1" /&amp;gt; &lt;br /&gt;&amp;lt;/asp:TableRow&amp;gt; &lt;br /&gt;&amp;lt;asp:TableRow ID="TableRow3" runat="server" TableSection="TableBody"&amp;gt; &lt;br /&gt;&amp;lt;asp:TableCell ID="TableCell7" runat="server" Text="Test1 2" /&amp;gt; &lt;br /&gt;&amp;lt;asp:TableCell ID="TableCell8" runat="server" Text="Test2 2" /&amp;gt; &lt;br /&gt;&amp;lt;asp:TableCell ID="TableCell9" runat="server" Text="Test3 2" /&amp;gt; &lt;br /&gt;&amp;lt;/asp:TableRow&amp;gt; &lt;br /&gt;&amp;lt;/asp:Table&amp;gt; &lt;br /&gt;&amp;lt;/form&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;/html&amp;gt; &lt;p&gt;CodeBehinde:&lt;/p&gt;&lt;p&gt;using System; namespace M2Office.Web.TestSeiten {&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public partial class LoadUserControl : System.Web.UI.Page {&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protected void Page_Load(object sender, EventArgs e) {&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RadioButtonList1.Attributes.Add("onclick", "MyClick(this)");&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Table1.Attributes.Add("onclick", "MyClick(this)");&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;/p&gt;&lt;p&gt;Javascript:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;function MyClick(obj){&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var evt = obj.onclick.arguments.length &amp;gt; 0? obj.onclick.arguments[0] : null;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(evt == null){ evt = window.event; }&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var obj1 = evt.srcElement? evt.srcElement : evt.target;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var obj2 = null; if(obj1.htmlFor != undefined){&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(document.getElementById(obj1.htmlFor).checked);&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else if(obj1.value != undefined){&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(obj1.value);&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else{&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert(obj1.tagName + " = " + obj1.innerHTML); } &lt;br /&gt;&amp;nbsp;} &lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/BC1A4D74-60FB-455B-9797-231450351E9B/Eventsource+bei+serverseitiger+Eventregistrierung+.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Thu, 10 Apr 2008 22:59:38 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.463AC34D-4AA5-4851-A750-BDCF3F161463.content.aspx</guid><title>Strings richtig formatieren</title><description> &lt;p&gt; Immer wieder hilfreich - Alexander Zeitler hat in seinem &lt;a title="Strings richtig formatieren" href="http://alexonasp.net/samples/stringformatting/" accesskey="L"&gt;Weblog&lt;/a&gt; eine Übersicht erstellt, wie man Strings richtig formatiert, wenn man bestimmte Anzeigeformen haben möchte.&lt;br /&gt; &lt;br /&gt; Nach Alex's Weblog-Umzug war der Link kurzzeitig verschwunden. &lt;br /&gt; &lt;br /&gt; Aber er ha sich ja wieder angefunden - Danke Alex!&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/463AC34D-4AA5-4851-A750-BDCF3F161463/Strings+richtig+formatieren.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Tue, 15 Jan 2008 23:05:10 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.CCED0B19-C6A9-40D6-A58A-7BF4C54D750A.content.aspx</guid><title>ClientID vom ServerControl automatisiert verfügbar machen</title><description>&lt;p&gt; Im Rahmen der Webentwicklung steht man immer wieder vor dem Problem, die richtige ClientID nach dem Rendern des HTML zu ermitteln. Der eine (aber unschönste Weg!) ist, über die Quellcodeansicht die zahlreichen ClientIDs zu ermitteln und dann zum Beispiel hartcodiert im Javascript einzufügen. &lt;br /&gt; Ein weiterer Weg ist über die Inlinecodeanweisung &amp;lt;% = ServerControlID.ClientID %&amp;gt; den Wert zu holen. Problemiliatisch ist dieses Vorgehen aber für den Fall, wenn man über eine externe Scriptdatei im Code die Information benötigt. Hier bekommt man dann solche Auskünfte:&lt;/p&gt; &lt;p&gt; &lt;img alt="alertcontrol" src="http://www.drescher-hackel.de/content/binary/alertcontrol.png" /&gt;&lt;/p&gt; &lt;p&gt; Einen anderen Weg kann man gehen, wenn man auf JSON zurückgreift. Hier erlangt man fast vollständige Flexibilität über seine Clientobjekte.&lt;br /&gt; Zunächst habe ich die Webseite nach allen Controls, die das ID-Attribute gesetzt haben, untersucht.&lt;/p&gt; &lt;p&gt; private void SetClientIDs( ControlCollection ctls) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach ( Control ctrl in ctls) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ctrl.HasControls())&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetClientIDs(ctrl.Controls);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteControlIDtoSb(ctrl);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt; }&lt;/p&gt; &lt;p&gt; In der Methode WriteControlIDtoSb(ctrl) erstelle ich dann den JSON-String:&lt;/p&gt; &lt;p&gt; private void WriteControlIDtoSb( Control ctrl) {&lt;br /&gt; try {&lt;br /&gt; if (ctrl.ID.ToString() != string.Empty) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat( "\"{0}\": {{" , ctrl.ID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat( "\"id\" : (\"{0}\"), ", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat( "\"style\" : document.getElementById(\"{0}\").style, ", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"className\" : document.getElementById(\"{0}\").className, ", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (ctrl.GetType().Equals(typeof(DropDownList)) ||&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctrl.GetType().Equals(typeof(HtmlSelect))) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;if (ctrl.GetType().Equals(typeof(DropDownList)) &amp;amp;&amp;amp; ((DropDownList)ctrl).Items.Count &amp;gt; 0) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("\"Items\" : [ ");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; ((DropDownList)ctrl).Items.Count; i++) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("{");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"value\" : document.getElementById(\"{0}\").options[{1}].value, ", ctrl.ClientID, i);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"text\" : document.getElementById(\"{0}\").options[{1}].text, ", ctrl.ClientID, i);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"selected\" : document.getElementById(\"{0}\").options[{1}].selected }}", ctrl.ClientID, i);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i &amp;lt; ((DropDownList)ctrl).Items.Count - 1)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(", ");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("] , ");&lt;br /&gt; }&lt;br /&gt; if (ctrl.GetType().Equals(typeof(HtmlSelect)) &amp;amp;&amp;amp; ((HtmlSelect)ctrl).Items.Count &amp;gt; 0) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("\"Items\" : [ ");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; ((HtmlSelect)ctrl).Items.Count; i++) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("{");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"value\" : document.getElementById(\"{0}\").options[{1}].value, ", ctrl.ClientID, i);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"text\" : document.getElementById(\"{0}\").options[{1}].text, ", ctrl.ClientID, i);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"selected\" : document.getElementById(\"{0}\").options[{1}].selected }}", ctrl.ClientID, i);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i &amp;lt; ((HtmlSelect)ctrl).Items.Count - 1)&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append(", ");&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("] , ");&lt;br /&gt; }&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"selectedText\" : document.getElementById(\"{0}\").options[document.getElementById(\"{0}\").selectedIndex].text,", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"selectedValue\" : document.getElementById(\"{0}\").options[document.getElementById(\"{0}\").selectedIndex].value,", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"value\" : document.getElementById(\"{0}\").value, ", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"onchange\" : document.getElementById(\"{0}\").onchange, ", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.AppendFormat("\"onclick\" : document.getElementById(\"{0}\").onclick ", ctrl.ClientID);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;sb.Append("},");&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; catch { }&lt;br /&gt; }&lt;/p&gt; &lt;p&gt; Hierbei habe ich den JSON-String so aufbereitet, dass ich nur bestimmte Eigenschaften im direkten Zugriff habe. Die Methode ist dabei beliebig erweiterbar und soll hier nur einen möglichen Ansatz wiedergeben.&lt;br /&gt; Zum Schluss muss das ganze noch zum Client transportiert werden:&lt;/p&gt; &lt;p&gt; ClientScript.RegisterStartupScript(this.Page.GetType(), "ClientObjekte", string.Format("&amp;lt;script type='text/javascript' &amp;gt;\r\n var ClientObjekt =&amp;nbsp;new Object();&amp;nbsp;\r\n eval('ClientObjekt = {{{0}}}}}');\r\n&amp;lt;/script&amp;gt;", sb.ToString().Substring(0, sb.ToString().Length - 2)));&lt;/p&gt; &lt;p&gt; Auf der Clientseite kann ich dann auf meine Serversteuerelemente direkt zugreifen:&lt;/p&gt; &lt;p&gt; ClientObjekt.UCTextBox1.value - gibt den Text der TextBox "UCTextBox1" zurück.&lt;br /&gt; ClientObjekt.dropdownControl.selectedText - gibt den ausgewählten Text der DropDownListe "dropdownControl" zurück.&lt;br /&gt; ClientObjekt.dropdownControl.Items[0].text - gibt den Text des ersten Elements&amp;nbsp;der DropDownListe "dropdownControl" zurück.&lt;/p&gt; &lt;p&gt; Der Debugger zeigt einen schönen Gesamtüberblick:&lt;/p&gt; &lt;p&gt; &lt;img alt="debugview" src="http://www.drescher-hackel.de/content/binary/ajaxprodatatable%20(debugging)%20-%20microsoft%20visual%20studio.png" /&gt;&lt;/p&gt; &lt;p&gt; Update: Peter Bucher &lt;a  href="http://www.aspnetzone.de/blogs/peterbucher/archive/2008/09/02/zwei-ans-tze-wie-mit-den-clientids-von-asp-net-umgegangen-werden-kann.aspx" &gt;zeigt&lt;/a&gt; in seinem Weblog, wie das ganze sich noch umsetzen läst.&lt;/p&gt;</description><link>http://weblog.drescher-hackel.de/CCED0B19-C6A9-40D6-A58A-7BF4C54D750A/ClientID+vom+ServerControl+automatisiert+verf%c3%bcgbar+machen.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 22 Jul 2007 19:04:54 GMT</pubDate></item><item><guid>http://weblog.drescher-hackel.de/gu.D1C54606-F55A-4FDB-A1DA-071514000FE5.content.aspx</guid><title>UniCode per Javascript ersetzen</title><description>&lt;p&gt; Im Rahmen meiner aktuellen Projektarbeit war wieder einmal auf der Suche nach einer L&amp;ouml;sung f&amp;uuml;r folgendes Problem:&lt;/p&gt; &lt;p&gt; Ich habe mir ein CustomControl geschrieben, das ein GridView l&amp;auml;dt und hier dann entsprechend der &amp;uuml;bergebenen Datenquelle den entsprechenden Text an eine Textbox im Control &amp;uuml;bergibt. &lt;br /&gt; Jetzt kommt es im deutsche Sprachraum immer wieder vor, da&amp;szlig; "Sonderzeichen" wie &amp;uuml;, &amp;auml;, &amp;ouml; usw. verwendet werden. (Vielleicht kommt ja noch die Reform der Reform und diese Zeichen werden im Wege der Globalisierung aus dem Schriftzeichensatz der deutschsprachigen Regionen gestrichen)&lt;br /&gt; &lt;br /&gt; &lt;img height="223" alt="DDT1" src="http://www.drescher-hackel.de/content/binary/DDT1.gif" width="350" border="0" /&gt;&lt;br /&gt; &lt;br /&gt; Wie man sehen kann, zeigt das GridView das "&amp;uuml;" noch richtig an. Der gerenderte HTML-Code stellt das "&amp;uuml;" allerdings als Unicode das - also "&amp;amp;#252;". Im Ergebnis wird die so auch an die Textbox &amp;uuml;bergeben:&lt;br /&gt; &lt;br /&gt; &lt;img height="19" alt="DDT2" src="http://www.drescher-hackel.de/content/binary/DDT2.gif" width="346" border="0" /&gt;&lt;br /&gt; &lt;br /&gt; Da mir ad hoc erst einmal keine L&amp;ouml;sung f&amp;uuml;r dieses Problem einfiel, kam mir der Gedanke, das Ganze an der Stelle zu l&amp;ouml;sen, wo der Inhalt an die Textbox &amp;uuml;bergeben wird. Also mu&amp;szlig;te eine Javascriptl&amp;ouml;sung her.&lt;/p&gt; &lt;p&gt; Die Aufgabenstellung war dabei bekannt: Es gibt eine Zeichenfolge, die eine oder mehrere Zeichenfolgen beinhaltet, die dem Muster "&amp;amp;#Zahl;" entspricht.&lt;/p&gt; &lt;p&gt; Die L&amp;ouml;sung ist dann ein prototype f&amp;uuml;r String().&lt;/p&gt; &lt;p /&gt; &lt;pre&gt; String.prototype.fromDecCode = function(){&lt;br /&gt; var i = null;&lt;br /&gt; var _i = null;&lt;br /&gt; var temp = null;&lt;br /&gt; var str = this;&lt;br /&gt; myRegExp = new RegExp();&lt;br /&gt; i = str.indexOf('&amp;amp;#');&lt;br /&gt; if(i &amp;gt; -1){&lt;br /&gt; _i = str.indexOf(';');&lt;br /&gt; temp = str.substring(i+2, _i);&lt;br /&gt; myRegExp.compile(temp,'g');&lt;br /&gt; str = temp.replace(myRegExp, String.fromCharCode(temp));&lt;br /&gt; }&lt;br /&gt; return str;&lt;br /&gt; }&lt;/pre&gt; &lt;p&gt; Damit war mein Problem gel&amp;ouml;st.&lt;br /&gt; Wie ich bei meiner Netzsuche feststellen mu&amp;szlig;te, hat sich in diversen Foren schon so manch anderer mit diesem Problem geplagt.&lt;/p&gt; &lt;p&gt; Update: 25.08.2007&lt;/p&gt; &lt;p&gt; Unicode - Codierungen f&amp;uuml;r deutsche Umlaute&lt;/p&gt; &lt;p&gt; &amp;auml; \u00c4&lt;br /&gt; &amp;auml; \u00e4&lt;br /&gt; &amp;ouml; \u00d6&lt;br /&gt; &amp;ouml; \u00f6&lt;br /&gt; &amp;uuml; \u00dc&lt;br /&gt; &amp;uuml; \u00fc&lt;br /&gt; &amp;szlig; \u00df&lt;/p&gt; &lt;p&gt; F&amp;uuml;r die UniCode Convertierung ist die folgende Methode sehr hilfreich: &lt;a href="http://proto.layer51.com/d.aspx?f=812"  accesskey="L" tabindex="0" title="Weitere Infos zu String.prototype.fromUniCode"&gt;&lt;strong&gt;String.prototype.fromUnicode&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; &lt;p /&gt;</description><link>http://weblog.drescher-hackel.de/D1C54606-F55A-4FDB-A1DA-071514000FE5/UniCode+per+Javascript+ersetzen.content.aspx</link><author>weblog@drescher-hackel.de (René Drescher-Hackel)</author><pubDate>Sun, 28 Jan 2007 23:02:56 GMT</pubDate></item></channel></rss>