Response.Redirect mit ~ Path
-
09-06-2019 - |
Frage
Ich habe eine Methode, bei der ich den Benutzer zurück zu einer Anmeldeseite im Stammverzeichnis meiner Webanwendung umleiten möchte.
Ich verwende den folgenden Code:
Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());
Das funktioniert allerdings nicht.Ich ging davon aus, dass ASP.NET die URL automatisch in den richtigen Pfad auflösen würde.Normalerweise würde ich einfach verwenden
Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());
Dieser Code befindet sich jedoch auf einer Masterseite und kann von jeder Ordnerebene aus ausgeführt werden.Wie kann ich dieses Problem umgehen?
Lösung
Ich denke, Sie müssen das „~/“ weglassen und es einfach durch „/“ ersetzen, ich glaube, / ist der Stamm
STOPPEN SIE GENAU! :-) es sei denn, Sie möchten Ihre Web-App fest codieren, sodass sie nur im Stammverzeichnis einer Website installiert werden kann.
"~/" Ist das Richtige, aber der Grund dafür, dass Ihr ursprünglicher Code nicht wie erwartet funktioniert hat, ist folgender ResolveUrl
(die intern verwendet wird von Redirect
) versucht zunächst herauszufinden, ob der von Ihnen übergebene Pfad eine absolute URL ist (z. B.„**http://server/**foo/bar.htm“ im Gegensatz zu „foo/bar.htm“) – aber leider geschieht dies, indem einfach nach einem Doppelpunkt „:“ in der von Ihnen angegebenen URL gesucht wird.In diesem Fall wird jedoch ein Doppelpunkt in der von Ihnen angegebenen URL gefunden ReturnPath
Abfragezeichenfolgenwert, der es täuscht – daher wird Ihr „~/“ nicht aufgelöst.
Die Lösung besteht darin, dass Sie die URL-Codierung vornehmen sollten ReturnPath
Wert, der dem problematischen „:“ zusammen mit anderen Sonderzeichen entgeht.
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));
Darüber hinaus empfehle ich Ihnen (oder irgendjemandem), es niemals zu verwenden Uri.ToString
- weil es eine für Menschen lesbare, „freundlichere“ Version der URL liefert – nicht unbedingt eine korrekte (sie entgeht Dingen).Verwenden Sie stattdessen Uri.AbsoluteUri – etwa so:
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));
Andere Tipps
Sie können die URL erste Antwort beheben. REDirect ("~/login.aspx);und fügen Sie die Parameter hinzu, nachdem es gelöst wurde.
Wie wäre es mit der Verwendung?
Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));