Geschrieben von: Christoph Wille
Kategorie: ASP Grundlagen
This printed page brought to you by AlphaSierraPapa
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.
Ein 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.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010530.zip
Eigene History
http:/www.aspheute.com/artikel/20001027.htm
Erstellung eines Intranets in ASP (Teil 3) - Navigation
http:/www.aspheute.com/artikel/20010919.htm
Flash Detection ohne Komponente
http:/www.aspheute.com/artikel/20020320.htm
JavaScript & DHTML - Wie man Fehler findet bevor die Kunden es tun
http:/www.aspheute.com/artikel/19990819.htm
Session State bei parallelen Browser-Frames und Fenstern
http:/www.aspheute.com/artikel/20000830.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.