【问题标题】:Get URL with virtual directory included?获取包含虚拟目录的 URL?
【发布时间】:2013-03-12 12:26:01
【问题描述】:

我正在维护一个 ASP.NET Web Forms 网站(我的意思是网站,它不是 Web 应用程序),并且一些静态链接已损坏,因为它们使用虚拟主机托管它目录。

http://www.somewhere.com/MyApp

所以,我开始沿着路径寻找一种方法来获取给定某个页面的虚拟路径的绝对 URL。我发现一篇文章提到你可以使用这样的链接:

<a href="/ContactUs.aspx">Contact Us</a>

然后做这样的事情:

<a href="<%= System.Web.VirtualPathUtility.ToAbsolute("/ContactUs.aspx") %>">Contact Us</a>

但这甚至不能在本地工作(即针对 ASP.NET 开发服务器),因为我的本地路径可能是这样的:

http://localhost:7766/MyApp

但是VirtualPathUtility 产生的路径是这样的:

http://localhost:7766/ContactUs.aspx

所以,我决定将它部署到我的本地 IIS 实例,看看它会如何运行。结果是一样的。本地 IIS 路径为:

http://localhost/MyApp

但联系我们页面的路径是:

http://localhost/ContactUs.aspx

最后一个障碍,应用程序中有一个链接如下所示:

<asp:HyperLink id="ContactUsLink"
    runat="server"
    Enabled="true"
    NavigateUrl="/ContactUs.aspx"
    Text="Contact Us">
</asp:HyperLink>

我之所以说这是相处中的一个障碍,是因为我知道内联代码(如上面的示例)不适用于服务器控件。它实际上会引发编译器错误:

服务器标签不能包含 结构。


看来我显然走错了路,我需要一些帮助。我期待着您的回答。

【问题讨论】:

    标签: c# asp.net webforms


    【解决方案1】:

    试试:

    Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath
    

    【讨论】:

      【解决方案2】:

      你应该在你的地址前加上一个~。所以“~/Contact.aspx”在任何 runat=server 控件上。这不适用于标准标签。您可以将 runat=server 添加到普通标签以使其成为服务器控件。

      运行时将看到 ~ 并使其与您正在运行的内容相关。

      <asp:HyperLink id="ContactUsLink"
          runat="server"
          Enabled="true"
          NavigateUrl="~/ContactUs.aspx"
          Text="Contact Us">
      </asp:HyperLink>
      

      【讨论】:

        【解决方案3】:

        您可以使用 ~ 来正确解析您的 URL,因此,您的 HyperLink 控件变为:

        <asp:HyperLink id="ContactUsLink"
            runat="server"
            Enabled="true"
            NavigateUrl="~/ContactUs.aspx"
            Text="Contact Us">
        </asp:HyperLink>
        

        ~ 符号将始终解析为您的应用程序的根目录,它会为您考虑虚拟路径。上述解决方案也将摆脱对服务器标签的需求,因此应该可以解决您的问题。

        无论出于何种原因,如果您想直接在代码中获取虚拟目录路径(即 URL 的 MyApp 部分),您可以使用 HttpContext.Current.Request.ApplicationPath,它将为您返回虚拟路径。然后,您可以使用它来派生您的 URL。

        【讨论】:

        • ~是必不可少的!
        【解决方案4】:
        window.location.protocol + "/" +(window.location.host + "/" + window.location.pathname);
        

        【讨论】:

          猜你喜欢
          • 2011-12-21
          • 2011-01-11
          • 1970-01-01
          • 2015-09-25
          • 1970-01-01
          • 1970-01-01
          • 2015-02-06
          • 2011-02-12
          • 1970-01-01
          相关资源
          最近更新 更多