以编程方式添加ScriptManager

时间:2012-03-07 19:18:01

标签: asp.net-ajax sitecore sitecore6 page-lifecycle

我正在尝试以编程方式添加ScriptManager控件,但前提是页面上不存在。我发现了许多这样的例子是把里面Page_Init的逻辑,这是有道理的(因为已经意识到它的的制作在情理之中见底编辑),但我发现之前我的例外Init方法受到了打击。

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'consoleUpdatePanel'的控件需要页面上的ScriptManager。ScriptManager必须出现在需要它的任何控件之前。”

编辑^ 2:这里真正发生的是,在生命周期中,Page_Init太晚了,无法附加ScriptManager(在我的情况下)。使用Init,首先触发所有子事件,然后是Page。 UpdatePanel的init没有看到ScriptManager,因此它引发了异常。将ScriptManager逻辑放在UpdatePanel init中解决了这个问题。

1 个答案:

答案 0 :(得分:2)

我通常做的是在我的基本布局中创建一个PlaceHolder控件。 然后在我的Page_Init中(或在需要ScriptManager的控件的Init中,如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);
    }
}

我在没有测试的情况下对其进行了一些修改,但它应该可以正常工作。