目前正在做的四川移動項目中遇到了一個小小的問題:主版頁面引用的指令碼的相對路徑該怎麼寫?
起因:對於這個相對路徑是對於主版頁面還是對於內容頁。答案是內容頁,(主版頁面只是替換內容頁),這樣就遇到了一個問題:當內容頁和主版頁面不在同一個目錄下的時候,並且內容頁也分別放在不同的檔案夾下的時候,不同的內容頁對於指令碼引用的相對路徑就有所不同。
提出問題:關於主版頁面MasterPage中引用JavaScript,CSS的問題,如果所有套用模板的頁面都在同一個路徑下,這個問題就不存在了。但是在實際中為了方面管理,往往會建立一些檔案夾,將引用的MasterPage放到不同的檔案夾下,這是在MasterPage引用的JS,CSS檔案由於路徑的問題,在套用主版頁面中的內容頁面中不一定都能訪問到。那這個問題該如何解決了?
解決問題:通過自己的努力思考和網上的參考資料得到一些解決辦法:
方法一:
string JSFile = "<script language=\"javascript\" src=\"{0}\" type=\"text/javascript\"></script>";
Response.Write(string.Format(JSFile,ResolveUrl("~/Javascript/jquery.js")));
這個方法雖然可以快速解決問題,但是Response.Write是將指令碼的引用寫到了Html頁面的開頭,這就破壞了XHTML的格式,會帶來各種存在的隱患,據資料:用ASP.net AJAX開發,發現很多Asp.net AJaxControlToolkit中很多控制項不起作用了。後來發現說是由於Response.Write引起的結果。
方法二:
string JSFile = "<script language=\"javascript\" src=\"{0}\" type=\"text/javascript\"></script>";
Page.Header.InnerHtml = string.Format(JSFile,ResolveUrl("~/Javascript/jquery.js"));
這種方法就可以實現而且可以很好的解決方案中的問題。
方法三:
HtmlLink link = new HtmlLink();
link.Href = string.Format(JSFile,ResolveUrl("~/CSS/base.css"));
link.Attributes["rel"] = "stylesheet"; link.Attributes["type"] = "text/css";
page.Header.Controls.Add(link);
這是註冊樣式的一種方法。
方法四:註冊用戶端指令碼的方法,結合ASP.NET AJAX 中的ScriptManager控制項來實現。
用ScriptManager,這是ASP.net AjaxConrolToolkit的一個控制項,通過這個控制項愛你可以很好的動態根據所引用主版頁面的指令碼路徑,自動的把主版頁面中引用的相對於主版頁面中的路徑轉換成相對於所引用內容頁的相對路徑。用法如下:
<asp:ScriptManager ID="ScriptManagerMain" EnablePageMethods="true" runat="server">
<Scripts>
<asp:ScriptReference ScriptMode="Auto" Path="~/JavaScript/Common.js" />這裡是相對於主版頁面的相對路徑,當然也可以用Path=”~/JS/Jscript1.js”(相對於網站的根目錄)也可以實現。
</Scripts>
</asp:ScriptManager>
前提條件:裝了ajax在.net環境中的組件才能用<asp:ScriptManager>,還用注意一點,這個控制項還需要給程式指定一個資源的指令檔,是在System.web.Extensions中的。所以需要在web.config中指定:
<httpHandlers>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
</httpHandlers>
其他一些方法:
1.既然不同頁面所引用的指令碼路徑不同,那就把它分開,不把引用的指令檔放到主版頁面,而把指令檔的引用分別放到各自引用的頁面上。這是一種不是辦法的辦法。雖然不是好辦法,但是能夠解決這個問題。
2.用你的網站所在的伺服器的根目錄,注意不是你的網站的根目錄,用這種符號“/”來表示,但是這樣的可移植性比較差。因此當網站的根目錄與伺服器根目錄不同時,就會發生錯誤。
最後補充一點:一些符號的含義:
./Image/和Image/ 相對路徑
../ 相對於當前路徑的上一級的路徑
~/是相對於網站根目錄的相對路徑。(注意這是只能在伺服器端識別,用戶端不能識別)
/表示相對於網站所在伺服器根目錄的相對路徑(注意這是相對於伺服器的根目錄而不是網站根目錄)