1

Я хотел бы быть в состоянии сделать что-то вроде:Возможно иметь внутренний контроль над пользовательским контролем сервера?

<ui:Tab Title="A nice title"> 
    <TabTemplate> 
    <asp:Literal runat="server" ID="SetMe">With Text or Something</asp:Literal> 
    </TabTemplate> 
</ui:Tab> 

, но и быть в состоянии сделать:

<ui:Tab Title="A nice title"> 
    <TabTemplate> 
    <asp:DataList runat="server" ID="BindMe"></asp:DataList> 
    </TabTemplate> 
</ui:Tab> 

код ответа я в конце концов придумал:

[ParseChildren(true)] 
public class Node : SiteMapNodeBaseControl, INamingContainer 
{ 
    private ITemplate tabTemplate; 
    [Browsable(false), 
    DefaultValue(null), 
    Description("The tab template."), 
    PersistenceMode(PersistenceMode.InnerProperty), 
    TemplateContainer(typeof(TabTemplate))] 
    public ITemplate TabTemplate 
    { 
     get { return tabTemplate; } 
     set { tabTemplate = value; } 
    } 
    protected override void CreateChildControls() 
    { 
     if (TabTemplate != null) 
     { 
      Controls.Clear(); 
      TabTemplate i = new TabTemplate(); 
      TabTemplate.InstantiateIn(i); 
      Controls.Add(i); 
     } 
    } 
    protected override void Render(HtmlTextWriter writer) 
    { 
     EnsureChildControls(); 
     base.Render(writer); 
    } 
} 


public class TabTemplate : Control, INamingContainer 
{ 
} 

ответ

1

Атрибут ParseChildren сообщает .NET, следует ли рассматривать дочерние элементы вашего элемента управления как свойства или как элементы управления. Для первого примера, вы хотите, чтобы лечить детей в качестве контроля, поэтому добавьте

[ ParseChildren(ChildrenAsProperties = false) ] 

Для второго, вы хотите ChildrenAsProperties = True, и TabTemplate свойство типа ITemplate. После этого есть какая-то сантехника, о которой описывает this MSDN sample. Это не добавляет большого значения, если вам нужен только один шаблон.

+0

Я приклеил то, что у меня есть. Почти ...: P – rball