Redirects mit Frame-Targets
Geschrieben von: Christoph Wille Eine der häufigeren Fragen in den ASP Listen ist ob und wie man dem Befehl Response.Redirect ein Frame Target angeben kann. Die Antwort darauf ist nein, denn Frames sind ein clientseitiges Konzept, von dem ASP nichts weiß. Aber - was hindert uns, dem Client clientseitigen Code zu schicken, die gewünschte Seite in einem anderen Frame zu laden? Nichts. Alles was wir dazu brauchen, ist ein bischen JavaScript - nichts außergewöhnliches, nur ein einfacher Redirect per JavaScript. Um das ganze nicht in der Luft hängen zu lassen, habe ich ein einfaches Frameset gebastelt, das primär aus rein statischen HTML Seiten besteht. Das Framsetdokument framset.htm sieht wie folgt aus: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Simple Frameset</title> </head> <!-- frames --> <frameset cols="200,*"> <frame name="frmLeft" src="Left.htm" marginwidth="10" marginheight="10" scrolling="auto" frameborder="1"> <frame name="frmRight" src="Right.htm" marginwidth="10" marginheight="10" scrolling="auto" frameborder="1"> </frameset> <body> Browser doesn't support frames. </body> </html> Keine Tricks bis dato. Ebensowenige finden sich in Right.htm, das eigentlich nur eine leere HTML Datei ist (deshalb auch hier kein Listing). Interessant ist für unser Vorhaben eigentlich nur left.htm, das unser Script RedirectSample.asp aufruft: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Left</title> </head> <body> <a href="RedirectSample.asp">Test Redirect</a> </body> </html> Was passiert also in RedirectSample.asp? Wir müssen ein JavaScript zurückschicken, das den Client auf die passende Seite im passenden Frame redirected. All diese gewünschte Funktionalität ist in der Funktion TargetedRedirect verpackt, die in unserer RedirectSample.asp wie folgt aufgerufen wird: <% TargetedRedirect "http://www.aspheute.com/", "frmRight", True %> <!--#include file="Left.htm"--> Damit bekommen wir folgendes Ergebnis: Bevor ich das Geheimnis um die Implementierung von TargetedRedirect lüfte, muß ich noch die Frage um das Warum? für die #include Anweisung beantworten: unser serverseitiger Code rendert ein clientseitiges JavaScript, das ein bestimmtes Dokument in einem anderen Frame lädt. Nur - um unseren serverseitigen Code anzustoßen, wird der linke Frame neu geladen, und das bedeutet, er wäre leer, wenn wir nur den Redirect-Code schicken würden. Deshalb schicke ich left.htm ganz einfach noch einmal, der Redirect-Code ist vor dem Inhalt von left.htm "angehängt": <script language="JavaScript"> parent.frmRight.location.replace('http://www.aspheute.com/'); </script> ... // hier folgt left.htm per #include ... Dieser Code wird in der Funktion TargetedRedirect erzeugt. Diese will ich nun nicht länger vorenthalten: <script language="vbscript" runat="server"> Sub TargetedRedirect(ByVal strTarget, ByVal strTargetFrame, ByVal bDontTouchHistory) Response.Write "<scr" & "ipt language=""JavaScript"">" & vbCrLf Response.Write "parent." & strTargetFrame & ".location." If True = bDontTouchHistory Then Response.Write "replace(" & "'" & strTarget & "');" Else Response.Write "href='" & strTarget & "';" End If Response.Write vbCrlf & "</scr" & "ipt>" & vbCrlf End Sub </script> Die ersten beiden Parameter sind selbsterklärend, interessant wird der dritte. Anhand dieses boolschen Parameters wird unterschiedliches JavaScript gerendert - einmal wird die History des Browsers nicht verändert, im anderen Falle wird der Redirect in die History eingetragen. Ein Parameter, der durchwegs nützlich werden kann. Vielleicht fragt sich der eine oder andere, warum ich die <script> Blöcke so zerlegt habe. Nun, das hat einen guten Grund: der ASP Parser ist nicht gerade der Beste, er verstolpert sich über solche Tags mit der folgenden Fehlermeldung: Active Server Pages error 'ASP 0138' Nested Script Block /aspheute/redirects/RedirectSample.asp, line 3 A script block cannot be placed inside another script block. Ein bekanntes Problem, das durch Zerstückelung der Strings leicht gelöst werden kann. SchlußbemerkungEin Problem bleibt klarerweise - hat der Benutzer JavaScript ausgeschaltet, dann ist die heute vorgestellte Methode funktionsuntüchtig. Nur um dieses Problem gibt es dann tatsächlich keinen Weg herum. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Eigene History Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |