2010-12-03 22 views
2

這與this的問題完全相同,從5月份未回覆。ScriptManager多次向頁面添加腳本(複製)

注意:this未回覆的帖子準確地描述了行爲 - 在UpdatePanel中,用戶控件中的ScriptManager.RegisterClientScriptBlock在<head>中添加的額外腳本導致重複。 C#.NET 4.0。頁面的結構如下:

MasterPage 
    Page 
     UserControl1 (ascx) - loaded in code by Page 
     UpdatePanel 
      UserControl2 (ascx) - loaded in code by UserControl1 

第一次在正文中按預期添加腳本。該代碼,簡單地說,在UserControl2的OnInit:

ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "myscript", script, true); 

我也嘗試引用「本」,而不是頁面,並沒有真正意義,因爲我不想重複在同一腳本鍵頁面,如果用戶控件在頁面上多次加載,但它無法正常工作。

經過部分回發後,腳本再次被添加 - 但好奇地在頁面的<head>,而不是正文,有趣的是,缺少asp.net通常添加的正常的包裝。

UserControl1添加的另一個腳本在部分回發後以完全相同的方式重複。

有誰知道爲什麼會發生這種情況?

+0

你想如何註冊腳本?當整個頁面只生成? – akonsu 2010-12-03 15:38:54

+0

Jsut作爲一個筆記,你鏈接的問題似乎被回答... – Chris 2010-12-03 15:51:11

+0

@Chris對不起,你說得對,它被回答,但這不是我的問題,也許是他的,雖然它沒有被接受。我正在使用相同的類型和密鑰。我確實發現其他人在別處詢問這個問題,但沒有解釋或答案。 – 2010-12-03 15:57:33

回答

2

您是否嘗試過使用簡單的IsPostBack子句在頁面的Init/Load/PreRender/Render函數內包裝代碼?這會阻止它在首次加載頁面後註冊腳本。

if(!IsPostBack) 
{ 
    ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "myscript", script, true); 
} 
2

您可以添加支票以確認腳本是否在註冊之前已經註冊。

if (!Page.ClientScript.IsClientScriptRegistered (Page.GetType(), "myscript")) 
    ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "myscript", script, true); 

我希望這會有所幫助。

3

雖然我找不到有關這種方式或其他方面的太多討論,但似乎ScriptManager是無狀態的。因此,在部分回發中添加具有相同標記的腳本將導致重複。在實踐中(對我而言),這是很多時候不希望出現的行爲,因爲人們會認爲任何在UserControl中使用相同標籤多次註冊的腳本都是重複的,不應該重新註冊。如果你真的想註冊一個新的腳本(由於部分回發後發生的事情,例如),我認爲你應該要求給它一個ScriptManager的新標籤來重新註冊它。

我的解決方案是創建一個用於UserControls的自定義ScriptManager,它具有隻在第一次加載控件並使用ViewState維護狀態信息時註冊腳本的方法。也就是說,我爲第一次註冊的腳本保留了一個標籤列表,並將其保留在回發中,並且只重新註冊在該列表中找不到的腳本。腳本只是對用戶控件的一般支持,只應該註冊一次,這種方式會被跟蹤。

我不能只使用IsPostBack的原因是我有時使用Page.LoadControl動態加載usercontrols。不保證在第一次加載整個頁面時控件將被加載。也就是說,它可以在回發中第一次加載。所以,如果我只是使用IsPostBack腳本可能永遠不會被註冊。