Response.Redirect使用~Path

时间:2008-08-27 20:41:23

标签: c# asp.net response.redirect

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

我正在使用以下代码:

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

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

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

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

3 个答案:

答案 0 :(得分:66)

  

我认为您需要删除“〜/”并将其替换为“/”,我相信/是根

停止正确! :-)除非您想对您的网络应用进行硬编码,以便它只能安装在网站的根目录下。

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

解决方法是你应该对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));

答案 1 :(得分:0)

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

答案 2 :(得分:-3)

使用

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