我遇到了我认为应该是一个相当简单的问题,但是对于我的生活,我看不到我的问题。问题与 ScriptManager.RegisterStartupScript 有关,我以前使用过很多次。
我的情况是我有一个已插入页面的自定义 Web 控件。控件(以及一两个其他控件)嵌套在 UpdatePanel 中。它们被插入到页面上的 PlaceHolder 上:
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
这是页面上唯一的更新面板。
该控件需要运行一些初始 javascript 才能正常工作。控制调用:
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
我也试过:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
问题是脚本在页面首次显示时正确运行,但在部分回发后没有重新运行。我尝试了以下方法:
- 从 CreateChildControls 调用 RegisterStartupScript
- 从 OnLoad / OnPreRender 调用 RegisterStartupScript
- 对前两个参数使用不同的参数组合(在上面的示例中,Control 是 Page,Type 是 GetType(),但我尝试过使用控件本身等)。
- 我尝试过使用持久性和新的 id(并不是说我认为这两种方式都会产生重大影响)。
- 我使用了一些断点,因此验证了 Register 行被正确调用。
我唯一没有尝试过的是将 UpdatePanel 本身用作控件和类型,因为我不认为控件应该知道更新面板(无论如何似乎都不是获取更新的好方法控制板?)。
谁能看到我在上面做错了什么?
谢谢 :)
好吧,回答上面的查询 - 它确实看起来好像占位符以某种方式弄乱了 ScriptManager.RegisterStartupScript。
当我将控件从占位符中拉出并将其直接编码到页面上时,Register 脚本可以正常工作(我也将控件本身用作参数)。
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
任何人都可以解释为什么注入到 PlaceHolder 上的控件会阻止 ScriptManager 正确注册脚本吗?我猜这可能与动态控件的生命周期有关,但如果上述过程有正确的过程,我将不胜感激(据我所知)。