最近在學習開發服務器控件,其它就少不了為控件注冊js和css之類的資源文件,或者直接注冊純腳本樣式。其中就遇到如下問題:
1、 注冊的資源文件或純腳本樣式在生成的頁面中都不在head標簽中(當然這個不影響頁面功能)
2、 一個頁面使用多個一樣的控件時,會出現重復輸入(出現多余代碼)
第一個問題說到底也不是什么問題,主要是看個人喜歡。在瀏覽器里查看頁面源代碼時,也許就成了問題了,源代碼很不整潔,要是內容多時問題就更突出。本來想找腳本,卻在head標簽里找不到,只能到其它標簽里找了。(不知道有沒有哪些開發工具在查看源代碼時可以把它們都區分開來,以方便查找)
第二個卻實是個問題,也不多說了。
有問題就應該解決,為了方便看效果,把它改成了后台直接使用,開發服務器控件時也使用,只是不用引用嵌入資源文件。
代碼如下,兩個方法:

/// <summary> /// 注冊資源文件 /// </summary> /// <param name="path">路徑</param> /// <param name="key">要搜索的客戶端資源的鍵,防止</param> /// <param name="type">資源文件類型</param> public void RegisterResource(string path, string key, ResType type) { string resStr = string.Empty; switch (type) { case ResType.Js: resStr = string.Format("<script type=\"text/javascript\" language=\"javascript\" src=\"{0}\"></script>", path); break; case ResType.Css: resStr = string.Format("<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />", path); break; } //是否已輸出 if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), key)) { if (Page.Header != null) { LiteralControl link = new LiteralControl(); link.Text = "\r\n" + resStr; Page.Header.Controls.Add(link); } Page.ClientScript.RegisterClientScriptBlock(this.GetType(), key, "", false);//注冊資源key } }
此方法有三個參數,第一個path是資源文件路徑;第二個key是資源文件標識,用來防止重復注冊;第三個type,枚舉類型,樣式和腳本兩類。方法也很簡單,通過為頁面Header控件增加自己定義控件以達到想要的效果。Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), key)用來檢測當前頁面實例中此資源文件標識是否已經注冊過,Page.ClientScript.RegisterClientScriptBlock(this.GetType(), key, "", false)這個不可少,此作用就是在當前頁面實例中注冊該資源,其本來之意是注冊一個腳本,但此處的腳本為空。

/// <summary> /// 注冊腳本塊(或者樣式塊) /// </summary> /// <param name="script"></param> /// <param name="key"></param> /// <param name="type"></param> public void RegisterScript(string script, string key) { //是否已輸出 if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), key)) { if (Page.Header != null) { LiteralControl link = new LiteralControl(); link.Text = "\r\n" + script; Page.Header.Controls.Add(link); } Page.ClientScript.RegisterClientScriptBlock(this.GetType(), key, "", false);//注冊資源key } }
此方法有二個參數,第一個script 是腳本塊(或者樣式塊),如<script>******</script>或都<style></style>之類。方法體和上面的差不多,在此就不講了。
如何使用
此例在Page_Load方法里使用
protected void Page_Load(object sender, EventArgs e) { this.RegisterResource("css/StyleSheet1.css", "dfed", ResType.Css); this.RegisterResource("Scripts/JScript1.js", "dfed4", ResType.Js); this.RegisterScript("<script>alert('直接用script腳本輸入')</script>", "dfed6"); }
樣式文件:

body { } div { height:200px; background-color:Blue}
腳本文件:

alert('這是js文件里的腳本');
頁面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html>