在主版頁面中引用的外部檔案不外乎css 和js 檔案, css檔案比較簡單, 因為它的路徑是相對於主版頁面的位置而言的, 而js 則不然, 它是相對於內容頁而言的. 舉個例子, 有下面的檔案樹:
root
|_master.master
|_content1.aspx
|_js1.js
|_folder1
|_content2.aspx
在應用程式的根下面, 有一個主版頁面master.master, 一個內容頁content1.aspx, 一個js檔案js1.js, 另外, 還有一個處於folder1子目錄下的另一個內容頁conten2.aspx, 則, 在主版頁面中引用js1.js 時, content1 的相對路徑就是目前的目錄, 直接寫檔案名稱就行了, 可是對content2來說, js1.js 處於它的上層目錄, 相對路徑要寫作: ../js1.js , 由於此js 檔案是在主版頁面中的引用的, 所以這個相對路徑就沒辦法直接寫了.
解決辦法有:
1. 直接寫絕對路徑.
<script type="text/javascript" src="//virtualPath/js1.js"></script>
這種做法是我極度反感, 並且無法忍受的, 因為它使得虛擬目錄的名字無法改變, 而且事實上, 我們公司應用程式的名字和正式伺服器上虛擬目錄的名字是不同的, 所以這種方法要麼在開發階段無效, 要麼在運行階段無效, 除非應用程式名稱和虛擬目錄名總是一樣, 並且虛擬目錄名不會改變, 否則不應該這樣引用js.
2. 在伺服器端註冊.
Page.ClientScript.RegisterClientScriptInclude("js1.js", Page.ResolveClientUrl("~/js1.js"));
這種做法的缺點也是明顯的, 首先, 它必須放在page_load 之類的事件處理器中, 每次回傳都執行一次, 其次, 這樣引用後, 在頁面上寫js代碼時, 無法智能感知到已經引用的js 檔案, 減慢編程速度, 而且一大堆警告也不是什麼賞心悅目的事件.
3. 用ScriptManager 引用
<asp:ScriptManager ID="sm1" runat="server">
<Scripts>
<asp:ScriptReference ScriptMode="Auto" Path="~/Js1.js" />
</Scripts>
</asp:ScriptManager>
這種引用是可以智能感知到的, 目前為止也沒發現有什麼副作用, 是推薦的解決方案.
--
圖片url路徑問題也是相對於內容頁的, 所以在用戶端並沒有特別好的辦法, 建議是直接給img 控制項加個runat="server" 屬性, 例如:
<img alt="" src="images/img.gif" runat="server" />
這樣, 伺服器就會自動給它產生正確的url.
另外, 如果在樣式中指定了背景圖片之類的, 建議放入css檔案中, 在css檔案中, url() 裡面的相對路徑是相對於css檔案本身的, 而如果放入主版頁面中, 則就變成了相對於內容頁了. 例如:
主版頁面中:
<table class="css1">
css檔案:
.css1
{
background-image:url(../images/1.jpg);
background-repeat:no-repeat;
}
而如果把這兩個樣式放在table的style中, 就只有跟主版頁面路徑相同的內容頁才能正確顯示.
註:轉載自木只八刀的http://www.cnblogs.com/Moosdau/archive/2008/09/27/1301059.html(感謝他的文章)