close
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);
}
}
文章標籤
全站熱搜
留言列表