È possibile avere un controllo interno su un controllo server personalizzato?
Domanda
Vorrei poter fare qualcosa del tipo:
<ui:Tab Title="A nice title">
<TabTemplate>
<asp:Literal runat="server" ID="SetMe">With Text or Something</asp:Literal>
</TabTemplate>
</ui:Tab>
ma anche essere in grado di fare:
<ui:Tab Title="A nice title">
<TabTemplate>
<asp:DataList runat="server" ID="BindMe"></asp:DataList>
</TabTemplate>
</ui:Tab>
Codice di risposta alla fine mi è venuta in mente:
[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
{
}
Soluzione
L'attributo ParseChildren dice a .NET se trattare i figli del tuo controllo come proprietà o come controlli. Per il tuo primo esempio, vuoi trattare i bambini come controlli, quindi aggiungi
[ ParseChildren(ChildrenAsProperties = false) ]
Per il secondo, si desidera ChildrenAsProperties = true e una proprietà TabTemplate di tipo ITemplate. In seguito è stato coinvolto qualche impianto idraulico, che questo esempio MSDN descrive. Tuttavia, non aggiunge molto valore se hai bisogno di un solo modello.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow