Возможно ли иметь внутренний элемент управления на пользовательском элементе управления сервером?

StackOverflow https://stackoverflow.com/questions/616560

Вопрос

Я хотел бы иметь возможность сделать что-то вроде:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top