Response.Redirect utilizzando ~ Path
-
09-06-2019 - |
Domanda
Ho un metodo in cui desidero reindirizzare l'utente a una pagina di accesso situata nella radice della mia applicazione web.
Sto usando il seguente codice:
Response.Redirect("~/Login.aspx?ReturnPath=" + Request.Url.ToString());
Questo però non funziona.La mia ipotesi era che ASP.NET avrebbe risolto automaticamente l'URL nel percorso corretto.Normalmente, userei semplicemente
Response.Redirect("../Login.aspx?ReturnPath=" + Request.Url.ToString());
ma questo codice si trova su una pagina master e può essere eseguito da qualsiasi livello di cartella.Come posso aggirare questo problema?
Soluzione
Penso che tu debba eliminare "~/" e sostituirlo solo con "/", credo che / sia la radice
FERMATI LÀ! :-) a meno che tu non voglia codificare la tua app web in modo che possa essere installata solo nella root di un sito web.
"~/" È la cosa corretta da usare, ma il motivo per cui il codice originale non ha funzionato come previsto è quello ResolveUrl
(che viene utilizzato internamente da Redirect
) cerca innanzitutto di capire se il percorso che stai passando è un URL assoluto (ad es."**http://server/**foo/bar.htm" invece di "foo/bar.htm") - ma sfortunatamente lo fa semplicemente cercando i due punti ":" nell'URL che gli fornisci.Ma in questo caso trova i due punti nell'URL fornito nel file ReturnPath
query string value, il che lo inganna, quindi il tuo '~/' non viene risolto.
La soluzione è che dovresti codificare l'URL del file ReturnPath
valore che sfugge al problematico ":" insieme a qualsiasi altro carattere speciale.
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.ToString()));
Inoltre, consiglio a te (o a chiunque) di non usarlo mai Uri.ToString
- perché fornisce una versione dell'URL leggibile dall'uomo e più "amichevole" - non necessariamente corretta (non sfugge alle cose).Utilizza invece Uri.AbsoluteUri, in questo modo:
Response.Redirect("~/Login.aspx?ReturnPath=" + Server.UrlEncode(Request.Url.AbsoluteUri));
Altri suggerimenti
È possibile risolvere l'URL prima risposta.redirect ("~/login.aspx);e aggiungi i parametri dopo che è stato risolto.
Che ne dici di usare
Response.Redirect(String.Format("http://{0}/Login.aspx?ReturnPath={1}", Request.ServerVariables["SERVER_NAME"], Request.Url.ToString()));