我正在尝试以编程方式添加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中解决了这个问题。
答案 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);
}
}
我在没有测试的情况下对其进行了一些修改,但它应该可以正常工作。