Возможно ли иметь внутренний элемент управления на пользовательском элементе управления сервером? - PullRequest
1 голос
/ 05 марта 2009

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

<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 Ответ

1 голос
/ 06 марта 2009

Атрибут ParseChildren сообщает .NET, следует ли рассматривать дочерние элементы вашего элемента управления как свойства или как элементы управления. Для вашего первого примера вы хотите рассматривать детей как элементы управления, поэтому добавьте

[ ParseChildren(ChildrenAsProperties = false) ]

Во-вторых, вы хотите, чтобы ChildrenAsProperties = true, и свойство TabTemplate типа ITemplate. После этого происходит какая-то сантехника, которую описывает этот образец MSDN . Впрочем, это не добавляет ценности, если вам нужен только один шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...