Как я могу отобразить дочерние теги в пользовательском элементе управления сервером? - PullRequest
1 голос
/ 17 ноября 2010

Я работаю над пользовательским ServerControl, я создал его, как показано ниже:

[ParseChildren(true), PersistChildren(true)]
[ToolboxData("<{0}:Menu runat=\"server\"></{0}:Menu>")]
public class Menu : WebControl
{ 
    .....

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public MenuItem MenuItems { get; set; }
}

[ParseChildren(true), PersistChildren(true)]
public class MenuItem : WebControl
{ 
    ...... 

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public MenuItem SubMenuItems
    {
        get
        {
            if (_SubMenuItems == null) return new MenuItem();
            return _SubMenuItems;
        }
        set
        {
            _SubMenuItems = value;
        }
    }
    private MenuItem _SubMenuItems;

    [TemplateContainer(typeof(MenuItem))]
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Template { get; set; }
}

<%@ Register Assembly="JQueryMenu" Namespace="JQueryMenu" TagPrefix="MdsMenu" %>
<MdsMenu:Menu ID="Menu1" runat="server">
    <AnimationItems AnimationSpeed="Fast" AnimationType="Opacity_Height" DropShadow="true"
        Delay="1000" />
    <MdsMenu:MenuItem ID="MenuItem1" runat="server" Text="MenuItem 01">
        <MdsMenu:MenuItem runat="server">
            <Template>
                <asp:Button ID="Button1" runat="server" Text="Button" />
                <asp:CheckBox ID="CheckBox1" runat="server" />
            </Template>
        </MdsMenu:MenuItem>
    </MdsMenu:MenuItem>
    <MdsMenu:MenuItem ID="MenuItem2" runat="server" Text="MenuItem 01">
        <MdsMenu:MenuItem ID="MenuItem3" runat="server">
            <Template>
                <asp:Button ID="Button2" runat="server" Text="Button" />
                <asp:CheckBox ID="CheckBox2" runat="server" />
            </Template>
            <MdsMenu:MenuItem ID="MenuItem5" runat="server" Text="MenuItem 05">
            </MdsMenu:MenuItem>
            <MdsMenu:MenuItem ID="MenuItem6" runat="server" Text="MenuItem 06">
            </MdsMenu:MenuItem>
            <MdsMenu:MenuItem ID="MenuItem4" runat="server">
                <Template>
                    <asp:Image ID="Image1" runat="server" />
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                </Template>
            </MdsMenu:MenuItem>
        </MdsMenu:MenuItem>
    </MdsMenu:MenuItem>
</MdsMenu:Menu>

Теперь, как я могу проанализировать и обработать его методом RenderContent? !!! Следующий метод всегда выбрасывает первое исключение, это означает, что this.Controls всегда пуст !!!
Как я могу это сделать и как я могу получить доступ к вложенным дочерним элементам в методе RenderControl?

public class Menu : WebControl
{
    ....

    public override void RenderControl(HtmlTextWriter output)
    { 
        if (!this.HasControls())
           throw new Exception("Controls are empty");
        ....
    }
}

1 Ответ

2 голосов
/ 17 ноября 2010

Изменение

[ParseChildren(true)]

на

[ParseChildren(false)]

true означает, что вы хотите, чтобы дочерние элементы были проанализированы как атрибуты / свойства вашего класса, а не дочерние.

...