2008-08-27 6 views
27

J'ai une méthode où je veux rediriger l'utilisateur vers une page de connexion située à la racine de mon application web.Response.Redirect using ~ Path

J'utilise le code suivant:

Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString()); 

Cela ne fonctionne pas bien. Mon hypothèse était qu'ASP.NET résoudrait automatiquement l'URL dans le bon chemin. Normalement, je voudrais simplement utiliser

Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString()); 

mais ce code est sur une page principale, et peut être exécuté à partir tout niveau de dossier. Comment contourner ce problème?

Répondre

64

Je pense que vous devez laisser tomber le "~ /" et le remplacer par juste "/", je crois/est la racine

ARRÊT JUSTE LÀ! :-) à moins que vous ne vouliez coder en dur votre application Web de sorte qu'elle ne puisse être installée qu'à la racine d'un site Web.

« ~/» est la bonne chose à utiliser, mais la raison pour laquelle votre code d'origine ne fonctionne pas comme prévu est que ResolveUrl (qui est utilisé en interne par Redirect) essaie de travailler d'abord si le chemin que vous passez est une URL absolue (par exemple "** http://server/ ** foo/bar.htm" par opposition à "foo/bar.htm") - mais malheureusement, il le fait en cherchant simplement un caractère deux-points ':' dans l'URL que vous lui donnez. Mais dans ce cas, il trouve un deux-points dans l'URL que vous donnez dans la valeur de la chaîne de requête ReturnPath, qui le trompe - donc votre '~ /' n'est pas résolu. Le correctif est que vous devriez encoder l'URL la valeur ReturnPath qui échappe à la problématique ':' avec tous les autres caractères spéciaux.

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString())); 

De plus, je vous recommande (ou quelqu'un) ne jamais utiliser Uri.ToString - car il donne une version lisible par l'homme, plus « convivial » de l'URL - pas nécessairement correct (il décode les choses). Au lieu de cela, utilisez Uri.AbsoluteUri - comme ceci:

Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri)); 
-3

Qu'en est-il en utilisant

Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString())); 
+1

L'utilisation du nom de serveur est problématique car il est probable que le site utilise un DNS personnalisé. Avoir le protocole codé en dur comme "http" poserait aussi des problèmes pour les sites utilisant https. –