2009-07-04 4 views
1

ASP.NET 템플릿 시스템을 사용하는 합성 컨트롤을 가지고 놀고 있습니다.템플릿 ASP.NET 컨트롤 빌드

내 마크 업에서 HeaderTemplate 및 FooterTemplate을 정의하고이 둘 사이에 프로그래밍 방식으로 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에서 파생시켜야했습니다.

답변

2
+0

감사합니다. 분명히 Control 대신 CompositeControl에서 DropZone 컨트롤을 파생시켜야합니다. 이제 모든 것이 예상대로 작동합니다. –

+0

아, 네. CompositeControl은 당신의 친구입니다. –

+0

또한 복합 컨트롤 대신 INamingContainer를 구현할 수도 있습니다. 고유 한 ID가 출력되도록하는 표식 템플리트입니다. CompositeControl이이 작업을 수행합니다. –

관련 문제