构建模板化的ASP.NET控件

时间:2009-07-04 15:28:46

标签: c# asp.net

我正在使用一个使用ASP.NET模板系统的复合控件。

我希望能够在我的标记中定义HeaderTemplateFooterTemplate,并以编程方式在两者之间添加UserControl

我瞄准的标记是这样的:

<asp:DropZone runat="server" ID="LeftZone">
   <HeaderTemplate>
      <h1>Getting started</h1>
   </HeaderTemplate>
   <FooterTemplate>
      <h3>The end of it...</h3>
   </FooterTemplate>
</asp:DropZone>

我的DropZone类看起来像这样:

public class DropZone : Control, INamingContainer
{
    private ITemplate headerTemplate;
    private ITemplate footerTemplate;

   [DefaultValue((string)null), 
    Browsable(false), 
    PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateInstance(TemplateInstance.Single)]
    public virtual ITemplate HeaderTemplate
    {
        get { return headerTemplate; }
        set { headerTemplate = value; }
    }

   [DefaultValue((string)null), 
    Browsable(false), 
    PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateInstance(TemplateInstance.Single)]
    public ITemplate FooterTemplate
    {
        get { return footerTemplate; }
        set { footerTemplate = value; }
    }

    protected override void OnInit(EventArgs e)
    {
        EnsureChildControls();
        base.OnInit(e);
    }

    private void AppendTemplate(ITemplate template, Control container)
    {
        if (template == null) return;

        var ph = new PlaceHolder();
        container.Controls.Add(ph);
        template.InstantiateIn(ph);
    }

    protected override void CreateChildControls()
    {
        Controls.Clear();

        AppendTemplate(HeaderTemplate, this);

        Control helloWorld = Page.LoadControl("~/WebParts/HelloWorld.ascx");
        if (helloWorld != null)
        {
            Controls.Add(helloWorld);
        }

        AppendTemplate(FooterTemplate, this);

        ChildControlsCreated = true;
        base.CreateChildControls();
    }
}

但是,这不起作用,因为ITemplate字段从未实例化。

任何帮助或指导都将受到高度赞赏。

更新:我必须从CompositeControl派生我的自定义控件才能让事情按预期运行。

1 个答案:

答案 0 :(得分:2)