[ASP.NET] 關於 RegisterClientScriptInclude 方法

今天有好幾個人問到這個函式的用法,以及為什麼要傳入 type 和 key 參數,這裡稍微整理一下。

原型宣告:
public void RegisterClientScriptInclude(string key, string url)
public void RegisterClientScriptInclude(Type type, string key, string url)

此方法可傳入三個參數,亦可傳入兩個參數。傳兩個參數時,是用參數 key 來當作識別,以判斷你的 JavaScript 區塊是否已經加入網頁了,這樣可以避免寫程式時不小心重複加入相同的 JavaScript 檔案而導致浪費網路頻寬。

傳三個參數時,表示要用參數 type 和 key 共同當作識別,亦即在判斷是否為重複加入的 script 時,必須 type 和 key 都相同才視為重複。另一方面,萬一剛好有兩個要註冊的 script 都使用了相同名稱的 key,而我們知道這兩個 script 是不同的、都必須注入網頁的,那麼我們就可以再加上 type 參數,以免被誤以為是重複 script 而沒有加入網頁中。

參數 type 要傳什麼呢?通常就是「會用到那個 script 的網頁」的型別,因此通常都是傳 Page.GetType(),例如:

protected void Page_Load(object sender, EventArgs e)
{
    ClientScript.RegisterClientScriptInclude(this.GetType(), "MyScript", "MyScript.js"); 
}

如果欲引用的 JavaScript 檔案跟網頁不在同一路徑下,可使用相對路徑語法,但不可使用 '~' 表示法。你可以用 Control 類別的 ResolveClientUrl() 方法來取得相對路徑,例如:

string srcPath = ResolveClientUrl("~/Scripts/MyScript.js");
ClientScript.RegisterClientScriptInclude(this.GetType(), "MyScript", srcPath);

Script 插入的位置

此方法會在前端網頁的 HTML 中插入類似這樣的 script 標籤:

<script src="MyScript.js" type="text/javascript"></script>

而且是插入至生成的網頁內容的上方--在 <form> 標籤裡面、__VIEWSTATE 後面。若想要讓引用 script 的標籤插入到 <header> 裡面,就得改用其他方法了。例如,你可以在 Page_Load 事件中這樣寫:

HtmlGenericControl htmlCtrl = new HtmlGenericControl("script"); 
htmlCtrl.Attributes.Add("type", "text/javascript"); 
htmlCtrl.Attributes.Add("src", "MyScript.js"); 
this.Page.Header.Controls.Add(htmlCtrl);

Happy coding! ^_^
Copyright © 2012. Huan-Lin 學習筆記 - All Rights Reserved
Powered by Blogger
Template Design by Cool Blogger Tutorials
Published by Templates Doctor