我有一个我认为应该是相当简单的问题,但就我的一生而言,我看不到我的问题.这个问题与ScriptManager有关.RegisterStartupScript,我以前使用过很多次.
我的场景是,我有一个自定义的web控件,该控件已插入到页面中.该控件(以及一个或两个其他控件)嵌套在UpdatePanel中.它们被插入到页面的占位符上:
<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);
我也try 过:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
问题在于,第一次显示页面时脚本运行正常,但在部分回发后不会重新运行.我try 了以下方法:
- 从CreateChildControls调用RegisterStartupScript
- 从onLoad/OnPreRender调用RegisterStartupScript
- 对前两个参数使用不同的参数组合(在上面的示例中,Control是Page,Type是GetType(),但我try 使用控件本身,依此类推).
- 我已经try 使用永久ID和新ID(我并不认为这两种方式都会产生重大影响).
- 我使用了几个断点,因此验证了寄存器行是否被正确调用.
我唯一没有try 的是使用UpdatePanel本身作为Control和Type,因为我认为控件不应该知道更新面板(而且无论如何,似乎没有获得更新面板的好方法?).
有没有人看到我在上面可能做错了什么?
谢谢:)
好吧,为了回答上面的问题,占位符似乎确实搞乱了ScriptManager.RegisterStartupScript.
当我将控件从占位符中拉出并将其直接编码到页面上时,Register脚本可以正常工作(我还将控件本身用作参数).
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
有人能解释一下为什么在占位符上注入控件会阻止ScriptManager正确注册脚本吗?我猜这可能与动态控件的生命周期有关,但是(据我所知)如果有一个正确的过程来处理上述问题,我将不胜感激.