| 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 |
|