<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Header.ascx.cs" Inherits="DarwinPortal.UserControls.Header" %>
<link href="<%=ResolveUrl("~/css/global.css")%>" rel="stylesheet" type="text/css" />
<a class="logo" href='<%=ResolveUrl("~/Default.aspx") %>' title="Dextrys Home">Dextrys Home</a>
head.ascx:
<LINK href="css/css.css" type="text/css" rel="stylesheet">
調用head.ascx
<td background="images/bar_bg.gif"><SCRIPT language="JavaScript" src="js/fade.js"></SCRIPT>
<table >
</table>
</td>
<asp:Image Runat="server" id="Image1" ImageUrl="../images/標題.gif"></asp:Image>
<img src="images/背景.gif">
<td background="images/背景.gif">//沒辦法解決這個路徑問題
問題1:
現在我們發現Image與img在指定圖片路徑時寫法不同。
<asp:Image ImageUrl= 前面加了../
<img src=直接用images
為什麼麼。
我們來分析一下
index.aspx在最終產生HTML時。head.ascx實際上是載入到了根目錄,所以head.ascx與images目錄是同級的。
img標籤用的直接是html代碼了。所以它在圖片在指定路徑時不要加../
而<asp:image 是伺服器控制項。如果不給它加../images那麼在產生最終頁面後。將產生
http://localhost/inf/UserControl/images/標題.gif
而不是
http://localhost/inf/images/標題.gif。而且<asp:image 比較智能。它能根據載入自己的頁面的位置,動態調整最後產生的HTML。保證圖片路徑不錯。
最後我們實試一下。我們發現http://localhost/inf/index.aspx中所有圖片正常,而http://localhost/inf/模組1/其它.aspx 中<asp:Image 顯示正常,而<img 不正常。
問題1解決方案:
A:所有圖片都用伺服器控制項<asp:Image 。但是對於那些作為<td 儲存格背景的圖片就沒辦法了
B:或是不要分目錄,所有aspx全扔在根目錄。(完全解決。所有的問題都不是問題。但是是最垃圾的方案,整個程式目錄結構真爛)
問題2:
現在,圖片的問題基本解決。但是另忘記了。head.ascx中還有一段css和js指令碼。當然要解決的話,在調用head.ascx的頁面上自己加上,把路徑寫對就是了。
但是現在看
<td background="images/bar_bg.gif"><SCRIPT language="JavaScript" src="js/fade.js"></SCRIPT>
<table >
</table>
</td>
這一段。
這個JS指令碼很特殊,它希望只作用在<td></td>這前的那個table上。如果在整個頁面都加的話。那麼作用的範圍就改變了。
擷取DNS主機名稱或者IP地址:
HttpContext.Current.Request.Url.Host
擷取虛擬程式根路徑:
HttpContext.Current.Request.ApplicationPath
這兩部分合起來就是你的虛擬網站名稱了。
<asp:Image ID="Image1" runat="server" ImageUrl="~/Images/head.JPG" />
(1)、發現利用伺服器控制項不會出現任何問題。伺服器端路徑伺服器端可以自動轉化,如果你加入ResolveUrl會發現反而畫蛇添足!
<img src='../Images/head.JPG' alt="測試" />
2)、如果用了HTML控制項,條件是:如果一個使用者控制項目錄裡中有一個使用者控制項,此使用者控制項利用HTML控制項來顯示其他目錄裡的圖片,此時如果此使用者控制項拖放到根目錄上的網頁時,不能正確顯示圖片,此時必須用ResolveUrl方法,就不會出現問題。寫法是:<img src='<%=ResolveUrl("../Images/head.JPG") %>' />
<img src='<%=ResolveUrl("../Images/head.JPG") %>' alt="測試" /
(3)、如果你要在html代碼中與資料庫中的資料幫定,比如一個連結,則可以寫成:
<a href='<%# ResolveUrl("~/Default.aspx?Param=") + Eval('DataItem')%>'>返回</a>
如果你是在後台代碼寫,比如一個連結,則可以寫成:Lable1.Text="<a href="+this.ResolveUrl("../view.aspx?id=")"+Id+">查看</a>"
(我也是在寫後台代碼遇到了這個問題,所以才寫這篇文章的)
結論:一句話,如果你用html控制項或html標籤最好加上ResolveUrl方法,以防止出錯;如果是用伺服器控制項就不用考慮 ResolveUrl方法了。
.ascx只是一個控制項,它需要aspx承載,也就是.ascx產生的串連等都要相對於承載ascx的aspx為準!
<a href="../a.aspx">a.aspx</a>表示你要從引用ascx的頁面串連到它的上一級目錄中的a.aspx,所以找不到是正常的!如果control檔案夾;和該檔案夾並列的有a.aspx和b.aspxc.aspx三個頁面都在網站的根目錄就不會有錯,如果它們在整個網站的虛擬目錄或實際目錄下就會有錯!也就是說http://www.cnblogs.com/這類的東西只對目錄有效,對網站無效!
如果你覺得你對路徑沒有把握,建議你使用asp:HyperLink 這樣,你就可以使用~/來表示根路徑了~~~