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);
    }
}
arrow
arrow
    文章標籤
    ajax updatepanel
    全站熱搜

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