ASP: Redirects mit Frame-Targets

Response.Redirect
Eine der häufigeren Fragen in den ASP Listen ist,  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:
<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.01 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 das Geheimnis um die Implementierung von TargetedRedirect gelüftet wird, muss noch die Frage um das "Warum"
für die #include Anweisung beantwortet werden: 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.
<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.
Schlussbemerkung
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.
Quelle:
http://www.aspheute.com/artikel/20010530.htm



 Ranking-Hits zurück Sitemap
Designed by www.wbrnet.info