我有一个方法,可以将用户重定向回位于web应用程序根目录下的登录页面
我正在使用以下代码:
Response.Redirect(“~/Login.aspx?ReturnPath=“+Request.Url.ToString());
但这不起作用。我的假设是ASP.NET会自动将URL解析为正确的路径。通常,我只会使用
Response.Redirect(“../Login.aspx?ReturnPath=“+Request.Url.ToString());
但此代码位于母版页上,可以从任何文件夹级别执行。我如何回避这个问题
我想你需要去掉“~/”而代之以“/”,我相信/是根
就停在那里:-)除非您想硬编码您的web应用程序,使其只能安装在网站的根目录下
“~/”是使用的正确方法,但原始代码没有按预期工作的原因是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));