可以对自定义服务器控件进行内部控制吗?
题
我希望能够做到这样的事情:
<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
{
}
解决方案
ParseChildren属性告诉.NET是否将控件的子项视为属性或控件。对于您的第一个示例,您希望将子项视为控件,因此请添加
[ ParseChildren(ChildrenAsProperties = false) ]
对于第二个,您需要ChildrenAsProperties = true,以及类型为ITemplate的TabTemplate属性。之后会涉及一些管道,此MSDN示例描述。如果你只需要一个模板,它不会增加很多价值。
不隶属于 StackOverflow