2008-10-08 80 views
28

我正在開發一個WebPart(它將用於SharePoint環境,儘管它不使用對象模型),我想公開AJAX功能。由於環境的性質,將腳本管理器直接添加到頁面不是一個選項,所以必須以編程方式添加。我試圖在我的webpart代碼中將ScriptManager控件添加到頁面中。以編程方式將ScriptManager添加到頁面?

protected override void CreateChildControls() 
{ 
    if (ScriptManager.GetCurrent(Page) == null) 
    { 
     ScriptManager sMgr = new ScriptManager(); 
     // Ensure the ScriptManager is the first control. 
     Page.Form.Controls.AddAt(0, sMgr); 
    } 
} 

然而,執行該代碼時,我得到了以下錯誤消息:

"The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases."

有另一種方式來使用ScriptManager從Web部件添加到頁面,還是我將不得不只需將ScriptManager添加到將使用WebPart的每個頁面(或母版頁)?

回答

40

我能得到這個通過頁面的初始化事件的工作:

protected override void OnInit(EventArgs e) 
{ 
    Page.Init += delegate(object sender, EventArgs e_Init) 
       { 
        if (ScriptManager.GetCurrent(Page) == null) 
        { 
         ScriptManager sMgr = new ScriptManager(); 
         Page.Form.Controls.AddAt(0, sMgr); 
        } 
       }; 
    base.OnInit(e); 
} 
+0

我不知道這是否會導致其在頁面上不止一個的ScriptManager ...... – vitule 2009-07-21 13:04:25

6

我做這個和它的作品。爲控件創建佔位符:

<asp:PlaceHolder ID="WebGridPlaceholder" runat="server" > 
</asp:PlaceHolder> 

然後你就可以在CreateChildControls中做到這一點:

ScriptManager aSM = new ScriptManager(); 
aSM.ID = "GridScriptManager"; 
WebGridPlaceholder.Controls.Add(aSM); 
0

我有這個類似的問題,找到了最好的辦法是一個全球性的ScriptManager添加到母版,然後在您可以添加到它後面的代碼:

ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath)); 
5

我遇到了這個問題與自定義ascx服務器控件。我嘗試了許多解決方案,包括向控件的OnInit事件添加腳本(直到它檢查ScriptManager控件之後才執行腳本),在控件上的服務器標記內添加邏輯,並將事件添加到所有其他事件中。不好。我終於建成了從的ScriptManagerProxy繼承的控制,然後使用ktrauberman的一段代碼,稍加修改,如果需要添加一個ScriptManager:

public class ProxiedScriptManager : ScriptManagerProxy 
    { 
    protected override void OnInit(EventArgs e) 
    { 
     //double check for script-manager, if one doesn't exist, 
     //then create one and add it to the page 
     if (ScriptManager.GetCurrent(this.Page) == null) 
     { 
     ScriptManager sManager = new ScriptManager(); 
     sManager.ID = "sManager_" + DateTime.Now.Ticks; 
     Controls.AddAt(0, sManager); 
     } 

     base.OnInit(e); 
    } 
    } 

這爲我做。

4

我的基本問題和你們其他人一樣。我創建了一個自定義的ascx控件,並且希望能夠不用擔心調用頁面是否已經聲明瞭腳本管理器。通過將以下內容添加到ascx contorl本身,我解決了這些問題。

到ASCX頁 -

<asp:PlaceHolder runat="server" ID="phScriptManager"></asp:PlaceHolder>

在更新面板本身 - oninit="updatePanel1_Init"

到ascx.cs文件 -

protected void updatePanel1_Init(object sender, EventArgs e) 
{ 
    if (ScriptManager.GetCurrent(this.Page) == null) 
    { 
     ScriptManager sManager = new ScriptManager(); 
     sManager.ID = "sManager_" + DateTime.Now.Ticks; 
     phScriptManager.Controls.AddAt(0, sManager); 
    } 
} 

謝謝誰在這個線程中的其他人我開始了。

2

這是我可以讓我的更新面板在SharePoint 2007/2010兼容webpart中工作的唯一方法。我們使用2010版母版頁面,但沒有2007版母版頁面。

的.ascx

<asp:PlaceHolder ID="sMgr_place" runat="server" /> 
<asp:UpdatePanel runat="server" OnInit="updatePanel_Init"><ContentTemplate> 
... 
</ContentTemplate></asp:UpdatePanel> 

.ascx.cs

public void updatePanel_Init(object sender, EventArgs e) 
{ 
    if (ScriptManager.GetCurrent(Page) == null) 
    { 
     ScriptManager sMgr = new ScriptManager(); 
     sMgr.EnablePartialRendering = true; 
     sMgr_place.Controls.Add(sMgr); 
    } 
} 
1

我用在包含更新面板自定義Web控件(的.cs)的代碼。

protected override void OnInit(EventArgs e) 
{ 
    //... 
    if (ScriptManager.GetCurrent(this.Page) == null) 
    { 
     ScriptManager scriptManager = new ScriptManager(); 
     scriptManager.ID = "scriptManager_" + DateTime.Now.Ticks; 
     Controls.AddAt(0, scriptManager); 
    } 
    //... 
} 
相關問題