我希望能够做到这样的事情:
<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
{
}
答案 0 :(得分:1)
ParseChildren属性告诉.NET是否将控件的子项视为属性或控件。对于您的第一个示例,您希望将子项视为控件,因此请添加
[ ParseChildren(ChildrenAsProperties = false) ]
对于第二个,您希望ChildrenAsProperties = true,以及类型为ITemplate的TabTemplate属性。之后有一些管道工程,this MSDN sample描述了。如果你只需要一个模板,它不会增加很多价值。