2012-03-07 36 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