我遇到了我认为应该是一个非常简单的问题,但是对于我的一生,我看不到我的问题。问题与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);
问题在于该脚本在首次显示该页面时可以正确运行,但是在部分回发后不会重新运行。我尝试了以下方法:
我没有尝试过的唯一一件事就是使用UpdatePanel本身作为控件和类型,因为我不认为控件应该知道更新面板(在任何情况下,似乎都不是获取更新的好方法控制板?)。
有人可以看到我在上面可能做错了什么吗?
谢谢 :)
好吧,要回答上面的查询-看起来好像占位符以某种方式弄乱了ScriptManager.RegisterStartupScript。
当我将控件从占位符中拉出并直接将其编码到页面上时,Register脚本可以正常工作(我也将控件本身用作参数)。
ScriptManager.RegisterStartupScript(this,GetType(),Guid.NewGuid()。ToString(),script,true);
谁能解释为什么将已注入(inject)的控件放到PlaceHolder上会阻止ScriptManager正确注册脚本的原因?我猜想这可能与动态控件的生命周期有关,但是(据我所知)如果有上述正确的过程,我将不胜感激。
最佳答案
我认为您确实应该使用RegisterStartupScript的Control overload。
我在服务器控件中尝试了以下代码:
[ToolboxData("<{0}:AlertControl runat=server></{0}:AlertControl>")]
public class AlertControl : Control{
protected override void OnInit(EventArgs e){
base.OnInit(e);
string script = "alert(\"Hello!\");";
ScriptManager.RegisterStartupScript(this, GetType(),
"ServerControlScript", script, true);
}
}
然后在我的页面中,我有:
protected override void OnInit(EventArgs e){
base.OnInit(e);
Placeholder1.Controls.Add(new AlertControl());
}
其中Placeholder1是更新面板中的占位符。占位符上有几个其他控件,包括按钮。
这的行为完全符合您的预期,每次加载页面或导致更新面板更新时,我都会收到一条警告,说“Hello”。
您可能要查看的另一件事是,钩住在更新面板请求期间触发的某些页面生命周期事件:
Sys.WebForms.PageRequestManager.getInstance()
.add_endRequest(EndRequestHandler);
每次更新面板完成更新时,就会触发PageRequestManager endRequestHandler事件-这将允许您调用方法来设置控件。
我唯一的其他问题是:
关于c# - 无法获取嵌套在UpdatePanel中的WebControl中的ScriptManager.RegisterStartupScript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/802506/