2013-03-12 90 views
4

我正在維護一個ASP.NET Web窗體網站(我的意思是網站,它不是一個web應用程序),並且一些靜態鏈接被破壞,因爲它們正在託管它與一個虛擬目錄。獲取包含虛擬目錄的URL?

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> 

我之所以說這是一個混亂的原因是因爲我知道內聯代碼(與上述示例類似)不適用於服務器控件。實際上,它拋出一個編譯器錯誤:

Server tags cannot contain <% ... %> constructs.


所以看起來我清楚地向下移動了錯誤的道路,我需要一些幫助。我期待着你的回答。

回答

10

嘗試:

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

你應該前綴你的地址了〜。所以「〜/ Contact.aspx」在任何runat =服務器控件上。這不適用於標準標籤。您可以將runat = server添加到常規標記以使其成爲服務器控件。

運行時將會看到〜並使其相對於您正在運行的內容。

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

可以使用了〜會正確解決您的網址,因此,超鏈接控制變成這樣:

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

的〜符號將始終解析爲您的應用程序,它的根目錄我會考慮你的虛擬路徑。上述解決方案也將擺脫對服務器標籤的需求,所以應該解決您的問題。

如果您想直接在代碼中獲取虛擬目錄路徑(即URL的MyApp部分),您可以使用HttpContext.Current.Request.ApplicationPath來爲您返回虛擬路徑。然後你可以使用它來派生你的URL。

+0

〜是必不可少的! – stannius 2017-04-25 20:12:36

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