2012-03-07 72 views
0

我正在嘗試以編程方式添加ScriptManager控件,但僅當頁面上不存在該控件時。我發現了很多這樣的例子,把邏輯放在Page_Init裏面,這是有道理的(後來才意識到它不是有意義 - 參見底部編輯),但是在我的Init方法被擊中之前我得到一個異常。以編程方式添加ScriptManager

protected void Page_Init(object sender, EventArgs e) 
{ 
    if (ScriptManager.GetCurrent(Page) == null) 
    { 
     ScriptManager sMgr = new ScriptManager(); 
     Page.Form.Controls.AddAt(0, sMgr); 
    } 
} 

這讓我覺得Sitecore會以某種方式進入。有沒有人使用Sitecore成功完成這項工作?

謝謝。

編輯:我收到的例外如下:。「ID爲‘filtersUpdatePanel’的控制需要一個ScriptManager在頁面上任何需要它的控制之前,必須的ScriptManager出現」

編輯^ 2:這裏真正發生的事情是,Page_Init在生命週期中爲了附加ScriptManager(在我的情況下)太晚了。有了Init,所有的孩子事件都會先被觸發,然後被觸發。 UpdatePanel的init沒有看到ScriptManager,所以它拋出了一個異常。將ScriptManager邏輯放在UpdatePanel init中解決了這個問題。

+2

你能發佈異常嗎? – techphoria414 2012-03-07 21:20:41

+0

你走了。這不會有幫助嗎? – raynjamin 2012-03-08 14:40:09

回答

2

我通常做的是在我的基礎佈局中創建一個PlaceHolder控件。 然後在我的Page_Init(或在需要使用ScriptManager,就像一個UpdatePanel控件的初始化),我把下面的代碼:

if (ScriptManager.GetCurrent(this.Page) == null) 
{ 
    ScriptManager scriptManager = new ScriptManager 
    { 
     ID = String.Concat("ScriptManager", DateTime.Now.Date.Ticks), 
     EnablePartialRendering = true, 
     ScriptMode = ScriptMode.Release 
    }; 

    var placeholder = this.Page.FindControl("PlaceHolderScriptManager") as PlaceHolder; 

    if (placeholder != null) 
    { 
     placeholder.Controls.Add(scriptManager); 
    } 
} 

我已經修改了一些未經測試,但它應該工作的罰款。

+0

請參閱我的編輯注意事項。絕對幫助我得出答案!謝謝。 – raynjamin 2012-03-08 14:51:01