【问题标题】:Response.Redirect using ~ PathResponse.Redirect 使用 ~ 路径
【发布时间】:2010-09-07 01:40:35
【问题描述】:

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

我正在使用以下代码:

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

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

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

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

【问题讨论】:

    标签: c# asp.net response.redirect


    【解决方案1】:

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

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

    "~/" 正确的使用方法,但是您的原始代码没有按预期工作的原因是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));
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        怎么用

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

        【讨论】:

        • 使用服务器名称是有问题的,因为站点很可能使用自定义 DNS。将协议硬编码为“http”也会导致使用 https 的网站出现问题。
        • 如果有人想以这种形式这样做,我认为这是一个合法的选择
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        相关资源
        最近更新 更多