获取包含虚拟目录的URL?

时间:2013-03-12 12:26:01

标签: c# asp.net webforms

我正在维护一个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>

我之所以说这是一个顺利的原因是因为我知道内联代码(如上面的示例)不适用于服务器控件。它实际上抛出了编译器错误:

  

服务器代码不能包含&lt;%...%&gt;构建体。


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

4 个答案:

答案 0 :(得分:10)

尝试:

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

您可以使用〜将正确解析您的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。

答案 3 :(得分:0)

window.location.protocol + "/" +(window.location.host + "/" + window.location.pathname);