【问题标题】:Relative and absolute paths on ASP.NET/IISASP.NET/IIS 上的相对和绝对路径
【发布时间】:2011-10-06 12:15:51
【问题描述】:

我已经阅读了很多关于相对/绝对路径的文章,但我仍然无法理解这个问题。

以下代码来自我的 ASP.NET Master 页面:

<li><a>Reports</a>
    <ul>
        <li>
            <a href="/Reports/One.aspx">One</a>
        </li>
        <li>
            <a href="~/Reports/Two.aspx">Two</a>
        </li>
    </ul>
</li>

(请注意,一个链接有~,一个没有。)

网站运行时,第一个链接指向http://server/Reports/One.aspx,第二个链接指向http://server/company/project/Reports/~/Reports/Two.aspx

如何在不忽略 IIS 上设置的任何虚拟目录的情况下到达 ASP.NET 项目的根目录?

【问题讨论】:

    标签: asp.net iis path


    【解决方案1】:

    相对路径是相对于当前资源的,所以如果你正在查看

    http://yourhost/app/default.aspx

    reports/one.aspx 的相对路径将是 http://yourhost/app/reports/one.aspx。请注意相对路径中缺少前导 /。这就是它相对的原因。

    您可能已经猜到,绝对路径以/ 开头,它使用当前资源的主机名,因此http://yourhost/reports/one.aspx

    ~ 是一个红鲱鱼。这是一个.NET-only 附加项,供 ASP.NET 的各个部分使用,以使您的路径基于当前应用程序根目录。因此,如果您的应用程序根目录是 http://yourhost/app,那么您正在查看 http://yourhost/app/views/default.aspx,并且您向 .NET 询问了路径 ~/reports/one.aspx', you would be givenhttp://yourhost/app/reports/one.aspx`。

    ~ 不被 HTML、IIS 或 URL 使用,所以如果您的浏览器看到它,它会按原样使用它。

    注意:一些 Unix 服务器可以使用 ~ 映射到用户的主目录,但这只会使事情复杂化。

    【讨论】:

      【解决方案2】:

      runat="server" 属性添加到锚标记。您不能将 ~ 根运算符与 HTML 标记一起使用。只有服务器控件(Html 或 Web)可以使用它。

      <a runat="server" href="~/Reports/Two.aspx">Two</a>
      

      【讨论】:

      • 就像一个魅力!,谢谢!但为什么它成功了?
      • @dennisbot - runat="server" 导致 IIS 预处理标记。 ASP 符号 ~ 被解析为 Web 应用程序的根目录,并将绝对 URL 传递给浏览器。
      【解决方案3】:

      如果您不希望它们成为具有生成 ID 的服务器控件,请对所有文件使用 Page.ResovleUrl

      <a href='<%= Page.ResolveUrl("~/Reports/Two.aspx")%>'>Two</a>
      

      【讨论】:

        【解决方案4】:

        请阅读There is something about "Paths" for ASP.NET beginners。它将提供有关 ASP.NET 应用程序中“路径”的完整概念。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-15
          • 2013-07-14
          • 2010-12-17
          • 1970-01-01
          • 2012-10-16
          • 2011-06-30
          • 1970-01-01
          • 2014-02-06
          相关资源
          最近更新 更多