我遇到了我认为应该是一个非常简单的问题,但是对于我的一生,我看不到我的问题。问题与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
  • 对前两个参数使用不同的参数组合(在上面的示例中,“控件”是“页面”,而“类型”是GetType(),但是我尝试使用控件本身,等等)。
  • 我尝试使用持久性ID和新ID(不是我认为这对两种方式都将产生重大影响)。
  • 我已经使用了一些断点,因此已经验证了Register行是否被正确调用。

  • 我没有尝试过的唯一一件事就是使用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事件-这将允许您调用方法来设置控件。

    我唯一的其他问题是:
  • 您的脚本实际上在做什么?
  • 大概您可以在页面底部的HTML中看到脚本(在结束标记之前)?
  • 您是否尝试过放置一些“alert(“Here”);“在您的启动脚本中调用以查看是否被正确调用?
  • 您是否尝试过Firefox和Firebug-报告任何脚本错误吗?
  • 关于c# - 无法获取嵌套在UpdatePanel中的WebControl中的ScriptManager.RegisterStartupScript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/802506/

    10-11 16:39