在asp.net中创建嵌套的ServerControl

本文关键字:嵌套 ServerControl 创建 asp net | 更新日期: 2023-09-27 18:23:38

我想创建一个服务器控件,如下所示:

<%@ Register Assembly="MdsAccordionMenu" Namespace="MdsAccordionMenu" TagPrefix="cc1" %>
<cc1:MdsAccordionMenu ID="MdsAccordionMenu1" runat="server">
    <MdsAccordionMenuItem Title="Some Title">
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
        <MdsAccordionMenuItem Text="some text" Link="http://" IconUrl="image.png" />
    </MdsAccordionMenuItem>
</cc1:MdsAccordionMenu> 


我写了以下c#代码,但它不起作用:

MD坐标菜单.cs:

namespace MdsAccordionMenu
{
    [ToolboxData("<{0}:MdsAccordionMenu runat=server></{0}:MdsAccordionMenu>")]
    [ParseChildren(true, "MdsAccordionMenuItems")]
    [DefaultProperty("MdsAccordionMenuItems")]
    [Serializable]
    public class MdsAccordionMenu : WebControl
    {
        [Description("سرعت نمایش انیمیشن")]
        [DefaultValue(500)]
        public int AnimationSpeed { get; set; }
        [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
        public List<MdsAccordionMenuItem> MdsAccordionMenuItems { get; set; }
    }
}


MdsAccordionMenuItem.cs:

namespace MdsAccordionMenu
{
    //[TypeConverter(typeof(ExpandableObjectConverter))]
    [ParseChildren(true, "MdsAccordionItems")]
    [DefaultProperty("Title")]
    [Serializable]
    public class MdsAccordionMenuItem
    {
        [Description("تیتر منو")]
        [DefaultValue("Title")]
        [NotifyParentProperty(true)]
        public string Title { get; set; }
        [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
        [NotifyParentProperty(true)]
        public List<MdsAccordionItem> MdsAccordionItems { get; set; }
    }
}


MdsAccordiItem.cs:

namespace MdsAccordionMenu
{
    [Serializable]
    public class MdsAccordionItem : INamingContainer
    {
        [NotifyParentProperty(true)]
        [Description("متن")]
        public string Text { get; set; }
        [NotifyParentProperty(true)]
        [Description("آدرس لینک منو")]
        public string Link { get; set; }
        [NotifyParentProperty(true)]
        [Description("آدرس آیکون")]
        public string ImageUrl { get; set; }
    }
}

我该怎么做

在asp.net中创建嵌套的ServerControl

根据您的c#代码,标记应该如下。。。

<cc1:MdsAccordionMenu ID="MdsAccordionMenu1" runat="server">
            <MdsAccordionMenuItems>
                <cc1:MdsAccordionMenuItem Title="hello">
                    <MdsAccordionItems>
                        <cc1:MdsAccordionItem Text="Text"  Link="http://www.google.com" ImageUrl="~/Image.jpg" />
                    </MdsAccordionItems>
                </cc1:MdsAccordionMenuItem>
            </MdsAccordionMenuItems>
        </cc1:MdsAccordionMenu>

我可以解决问题

MdsAccordionMenu.cs

[ToolboxData("<{0}:MdsAccordionMenu runat=server></{0}:MdsAccordionMenu>")]
[ParseChildren(true, "MdsAccordionMenuItems")]
[DefaultProperty("MdsAccordionMenuItems")]
[PersistChildren(true)]
[TypeConverter(typeof(ExpandableObjectConverter))]
[Serializable]
public sealed class MdsAccordionMenu : WebControl, INamingContainer
{
    #region Properties
    public int AnimationSpeed { get; set; }
    public string InlineStyle { get; set; }
    [Bindable(true)]
    [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public MdsAccordionMenuItemsClass MdsAccordionMenuItems
    {
        get { return _mdsAccordionMenuItem ?? new MdsAccordionMenuItemsClass(); }
        set { _mdsAccordionMenuItem = value; }
    }
    private MdsAccordionMenuItemsClass _mdsAccordionMenuItem;
}

MdsAccordionMenuItem.cs

[Serializable]
public class MdsAccordionMenuItemsClass : List<MdsAccordionMenuItem>
{
}
[ParseChildren(true, "MdsAccordionItems")]
[PersistChildren(true)]
[Serializable]
public class MdsAccordionMenuItem : INamingContainer
{
    public string Title { get; set; }
    private MdsAccordionItemsClass _mdsAccordionItems;
    [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    [Bindable(true)]
    public MdsAccordionItemsClass MdsAccordionItems
    {
        get { return _mdsAccordionItems ?? new MdsAccordionItemsClass(); }
        set { _mdsAccordionItems = value; }
    }
}

MdsAccordiItem.cs

[Serializable]
public class MdsAccordionItemsClass : List<MdsAccordionItem>
{
}
[Serializable]
[ParseChildren(true, "MdsAccordionSubMenuItems")]
[PersistChildren(true)]
public class MdsAccordionItem : INamingContainer
{
    public string Text { get; set; }
    private bool _visible = true;
    public bool Visible
    {
        get { return this._visible; } 
        set { this._visible = value; }
    }
    public string Link { get; set; }
    public string ImageUrl { get; set; }
    private MdsAccordionItemsClass _mdsAccordionSubMenuItems;
    [Bindable(true)]
    [Browsable(false), PersistenceMode(PersistenceMode.InnerProperty)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public MdsAccordionItemsClass MdsAccordionSubMenuItems
    {
        get { return _mdsAccordionSubMenuItems ?? new MdsAccordionItemsClass(); }
        set { _mdsAccordionSubMenuItems = value; }
    }
}

现在,我可以用以下代码在设计器模式下创建控件:

<cc1:MdsAccordionMenu ID="MdsAccordionMenu1" runat="server" EnableViewState="True">
    <MdsAccordionMenuItems>
        <cc1:MdsAccordionMenuItem Title="Submit">
            <MdsAccordionItems>
                <cc1:MdsAccordionItem Text="Item 01" Link="#" ImageUrl="~/style/icons/lightbulb.png" />
                <cc1:MdsAccordionItem Text="Item 02" Link="#" ImageUrl="~/style/myImages/question.png" />
                <cc1:MdsAccordionItem Text="Item 03" Link="#" ImageUrl="~/style/myImages/request-knowledge.png" />
                <cc1:MdsAccordionItem Text="Item 04" Link="#" ImageUrl="~/style/myImages/document.png" />
                <cc1:MdsAccordionItem Text="Item 05" Link="#" ImageUrl="~/style/myImages/book.png" />
                <cc1:MdsAccordionItem Text="Item 06" Link="#" ImageUrl="~/style/myImages/document1.png" />
            </MdsAccordionItems>
        </cc1:MdsAccordionMenuItem>
    </MdsAccordionMenuItems>
</cc1:MdsAccordionMenu>