Возможно ли иметь внутренний контроль на пользовательском контроле сервера?
Я хотел бы иметь возможность сделать что-то вроде:
<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. После этого происходит какая-то сантехника, описанная в этом примере MSDN. Тем не менее, это не добавляет ценности, если вам нужен только один шаблон.