ClientScriptManager

用來註冊client端的script或其他資源,適用於一般的環境(非ajax)

在Ajax的環境中(有使用UpdatePanel)要使用ScriptManager才會有作用

 

範例

Page.ClientScript.RegisterStartupScript(Page.GetType(), "script", "DoSomething();", true);

如果元件或UserControl在UpdatePanel中 DoSomething() 是不會被呼叫的。

 

要改成使用ScriptManager 來註冊程式或其他資源才行

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "script", "DoSomething();", true);

 

不過使用ScriptManager 註冊時有個地方常常會被忽略,而造成client的負擔甚至程式變慢,怎麼說呢?

ScriptManager.RegisterStartupScript(
 Page
 , Page.GetType()
 , "script"
 , @"function DoSomething(){
 //do something for me 
 }"
 , true
 );

上面的 function DoSomething 每次postback都會被註冊一次,這樣的寫法乍看之下是對的. 執行是起來也沒有錯.

但是有一個重點在ajax的環境下UpdatePanel只是作部份更新. 所以實際上 DoSomething 這個function 早已存在於client端 . 如果每次postback都註冊一次,一來造成頻寬不必要的浪費二來也會拖慢client的效能. 尤其是註冊大型的script library 更是會加深這種負面的影響.

可以改成下面這種寫法,把註冊function 跟呼叫分開註冊.

ScriptManager sm = ScriptManager.GetCurrent(Page);
 
//如果不是ajax的環境
if (sm == null)
{
 Page.ClientScript.RegisterStartupScript(
 Page.GetType()
 , "script"
 , @"function DoSomething(){
 //do something for me 
 }"
 , true
 );
 Page.ClientScript.RegisterStartupScript(Page.GetType(), "script", "DoSomething();", true);
}
else
{
 //判斷是不是ajax 的postback
 if (!sm.IsInAsyncPostBack)
 {
 ScriptManager.RegisterStartupScript(
 Page
 , Page.GetType()
 , "script"
 , @"function DoSomething(){
 //do something for me 
 }"
 , true
 );
 ScriptManager.RegisterStartupScript(Page, Page.GetType(), "script", "DoSomething();", true);
 }
 else
 {
 ScriptManager.RegisterStartupScript(Page, Page.GetType(), "script", "DoSomething();", true);
 }
}
文章標籤
全站熱搜
創作者介紹
創作者 丫烈客 的頭像
丫烈客

丫烈客

丫烈客 發表在 痞客邦 留言(0) 人氣(5,189)