0

我有两个脚本控件(代码非常简化):

class Form : IScriptControl
{
      Panel pnl;
      Button trigger;
      public Form()
      {
           pnl = new Panel();
           trigger = new Button();

           IPresenter p = new Popup();
           p.SetContent(this.pnl);           
           this.Controls.Add(trigger);
      }
}

class Popup : IScriptControl, IPresenter
{
      public void SetContent(Control content)
      {
           this.Controls.Add(content);
      }
}

现在在 HTML 输出中,我看到以下内容(同样非常简化):

<div id="ctrlForm">
    <div id="ctrlPopup">
        <div id="ctrlFormPnl"></div>
    </div>
    <div id="ctrlFormTrigger"></div>
</div>

和脚本:

Sys.Application.add_init(function() {
    $create(Form, {"_presenter":"FormPresenter"}, null, null, $get("ctrlForm"));
});
Sys.Application.add_init(function() {
    $create(Popup, {"_isOpen":false}, null, null, $get("ctrlPopup"));
});

问题:我该怎么做,创建弹出窗口的脚本出现在表单脚本之前的页面上......换句话说,当 ctrlForm 控件的初始化程序执行时,我想获得对表单演示者的引用。

我希望我清楚地解释了我想要做什么。谢谢。

4

1 回答 1

1

为了归档您的目标,您应该让子控件 在您的控件之前向 ScriptManager 注册。

如果您在重写的 Render 方法中使用 ScriptManager 注册您的控件,则可以这样做,调用 base.Render(...) 之后,如下所示:

    protected override void Render(HtmlTextWriter writer)
    {
        // Let child controls to register with ScriptManager
        base.Render(writer);

        // Now, when all the nested controls have been registered with ScriptManager
        // We register our control.
        // This way $create statement for this control will be rendered
        // AFTER the child controls' $create 
        if (this.DesignMode == false)
        {
            ScriptManager sm = ScriptManager.GetCurrent(this.Page);
            if (sm != null)
                sm.RegisterScriptDescriptors(this);
        }

   }
于 2012-10-31T23:29:23.100 回答