Response.Redirect使用~Path

我有一个方法,我想将用户重定向回位于我的Web应用程序根目录的登录页面。

我正在使用以下代码:

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

但这不起作用。 我的假设是ASP.NET会自动将URL解析为正确的路径。 通常,我会使用

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

但此代码位于母版页上,可以从任何文件夹级别执行。 我该如何解决这个问题?

我认为你需要删除“〜/”并用“/”替换它,我相信/是根

停在那儿! :-)除非你想对你的网络应用程序进行硬编码,以便它只能安装在网站的根目录下。

“〜/” 正确使用的东西,但原始代码没有按预期工作的原因是ResolveUrl (由Redirect内部使用)尝试首先计算出你传递它的路径是绝对的URL(例如“** http:// server / ** foo / bar.htm”而不是“foo / bar.htm”) – 但遗憾的是,只需在URL中查找冒号字符’:’即可你给它。 但在这种情况下,它会在您在ReturnPath查询字符串值中给出的URL中找到一个冒号,这会ReturnPath它 – 因此您的’〜/’无法解析。

修复是您应该对ReturnPath值进行URL编码,该值会转义有问题的’:’以及任何其他特殊字符。

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

另外,我建议你(或任何人)永远不要使用Uri.ToString – 因为它提供了一个人类可读的,更“友好”的URL版本 – 不一定是正确的(它可以解决问题)。 而是使用Uri.AbsoluteUri – 像这样:

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

您可以先解决URL Response.Redirect(“〜/ Login.aspx);并在解析后添加参数。

怎么样使用

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