2008-08-27 37 views
27

Tengo un método donde quiero redirigir al usuario a una página de inicio de sesión ubicada en la raíz de mi aplicación web.Response.Redirect usando ~ Path

estoy usando el siguiente código:

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

esto no funciona, sin embargo. Mi suposición era que ASP.NET resolvería automáticamente la URL en la ruta correcta. Normalmente, solo usaría

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

pero este código está en una página maestra y se puede ejecutar desde cualquier nivel de carpeta. ¿Cómo puedo solucionar este problema?

Respuesta

64

creo que es necesario dejar caer el "~ /" y reemplazarla con sólo "/", creo que/es la raíz

PARADA ¡JUSTO AHÍ! :-) a menos que desee codificar su aplicación web para que solo pueda instalarse en la raíz de un sitio web.

"~ /" es la cosa correcta de usar, pero la razón de que el código original no funciona como se espera es que ResolveUrl (que se utiliza internamente por Redirect) trata de averiguar primero si el la ruta que está pasando es una URL absoluta (por ejemplo, "** http://server/ ** foo/bar.htm" en oposición a "foo/bar.htm"), pero desafortunadamente lo hace simplemente buscando un carácter de dos puntos ':' en la URL que le das. Pero en este caso encuentra dos puntos en la URL que usted da en el valor de la cadena de consulta ReturnPath, que lo engaña; por lo tanto, su '~ /' no se resuelve.

La solución es que debe codificar con URL el valor ReturnPath que escapa del ':' problemático junto con cualquier otro carácter especial.

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

Además, recomiendo que usted (o alguien) nunca utiliza Uri.ToString - porque da una legible, la versión más "amigable" de la URL - no uno necesariamente correcta (caracteres de escape cosas). En su lugar utilizar Uri.AbsoluteUri - de este modo:

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

Qué acerca del uso

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

utilizando el nombre de servidor es problemático, ya que es probable que el sitio podría utilizar un DNS personalizado. Tener el protocolo codificado como "http" también causaría problemas para los sitios que usan https. –