关于c#:Response.Redirect使用?路径

关于c#:Response.Redirect使用?路径

Response.Redirect using ~ Path

我有一种方法,可以将用户重定向到位于Web应用程序根目录的登录页面。

我正在使用以下代码:

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

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

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

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


I think you need to drop the"~/" and replace it with just"/", I believe / is the root

停在那儿! :-),除非您想对您的Web应用程序进行硬编码,以便只能将其安装在网站的根目录中。

"?/"是正确的用法,但是您的原始代码未按预期工作的原因是ResolveUrl(由Redirect内部使用)尝试首先确定所传递的路径它是一个绝对URL(例如," ** http://server/**foo/bar.htm"而不是" foo / bar.htm")-不幸的是,它只是通过查找冒号'来实现的:在您提供的网址中。但是在这种情况下,它会在您在ReturnPath查询字符串值中提供的URL中找到一个冒号,该冒号会将它弄糊涂了-因此您的'?/'无法解析。

解决方法是,您应该对ReturnPath值进行URL编码,该值可以避免出现问题的":"以及其他任何特殊字符。

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

另外,我建议您(或任何人)不要使用Uri.ToString-因为它提供了人类可读的,更"友好的" URL版本-不一定是正确的版本(它避免了转义)。而是使用Uri.AbsoluteUri-像这样:

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

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


那使用呢

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


推荐阅读