Resposta.Redirecionar usando ~ Caminho
-
09-06-2019 - |
Pergunta
Eu tenho um método que, onde eu quero redirecionar o usuário de volta para uma página de login localizado na raiz do meu aplicativo web.
Eu estou usando o seguinte código:
Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());
Isso não funciona embora.Minha suposição foi a de que ASP.NET gostaria de resolver automaticamente o URL para o caminho correto.Normalmente, eu só iria usar
Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());
mas este código em uma página mestra, e pode ser executado a partir de qualquer nível de pasta.Como posso contornar este problema?
Solução
Eu acho que você precisa soltar o "~/" e substitua-a apenas com "/", eu acredito que / é a raiz
PARE AÍ! :-) a menos que você queira embutir seu aplicativo da web de forma que ele só pode ser instalado na raiz de um web site.
"~/" é a coisa correta a se usar, mas a razão que o código original não funcionou como o esperado é que ResolveUrl
(que é usado internamente pelo Redirect
) tenta primeiro se o caminho que você está passando é uma URL absoluta (por exemplo,"**http://server/**foo/bar.htm" em oposição a "foo/bar.htm"), mas, infelizmente, ele faz isso simplesmente procurando um caractere de dois-pontos ':' na URL que você dê a ele.Mas, neste caso, encontra dois pontos na URL que você dá no ReturnPath
valor de cadeia de consulta, que leva - lo-portanto o '~/' não resolvido.
A correção é que você deve ser codificação URL a ReturnPath
valor que escapa à problemática ':', juntamente com outros caracteres especiais.
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));
Além disso, eu recomendo que você (ou qualquer pessoa) nunca uso Uri.ToString
- porque ele dá uma legíveis por humanos, mais "amigável", versão da URL - não necessariamente correto (unescapes coisas).Em vez disso, usar Uri.AbsoluteUri - assim:
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));
Outras dicas
você pode resolver o URL primeiro Resposta.Redirecionar("~/Login.aspx);e adicionar os parâmetros depois ele ficou resolvido.
Que tal usar
Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));