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에서 파생시켜야했습니다.
감사합니다. 분명히 Control 대신 CompositeControl에서 DropZone 컨트롤을 파생시켜야합니다. 이제 모든 것이 예상대로 작동합니다. –
아, 네. CompositeControl은 당신의 친구입니다. –
또한 복합 컨트롤 대신 INamingContainer를 구현할 수도 있습니다. 고유 한 ID가 출력되도록하는 표식 템플리트입니다. CompositeControl이이 작업을 수행합니다. –