我认为我的问题应该相当简单,但是就是找不到问题所在。这个问题与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);
我还尝试了以下方法:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
问题在于脚本在页面首次显示时运行正确,但是在部分回传后不重新运行。我尝试了以下方法:1.从CreateChildControls调用RegisterStartupScript
2.从OnLoad / OnPreRender中调用RegisterStartupScript
3.使用不同组合的参数来获取前两个参数(在上面的示例中,控件是Page,类型是GetType(),但我尝试过使用控件本身等)
4.尝试使用持续和新id(并不认为这样做会有重大影响);
5.我使用了一些断点,所以已经验证了Register行被正确调用。
唯一我没有尝试的就是将UpdatePanel本身用作Control和Type,因为我不认为Control应该知道UpdatePanel(而且在任何情况下,似乎也没有很好的获取UpdatePanel的方式吗?)。
有人能看出我在上面做错了什么吗?
谢谢 :)
总的来说,回答上面的查询-似乎站位符有些问题,可能会导致ScriptManager.RegisterStartupScript失效。
当我将控件从站位符中取出并直接编写在页面上时,Register脚本可以正常工作(我还将控件本身用作参数)。
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
有人能解释一下为什么向PlaceHolder注入控件会阻止ScriptManager正确注册脚本吗?我猜这可能与动态控件的生命周期有关,但出于自己的知识,是否有正确的过程来解决这个问题?