Создание вложенного ServerControl в asp.net? - PullRequest
0 голосов
/ 08 февраля 2012

Я хочу создать серверный элемент управления следующим образом:

<%@ 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 #, но он не работает:

MdsAccordionMenu.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; }
    }
}


MdsAccordionItem .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; }
    }
}

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

Я мог бы решить проблему

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; }
    }
}

MdsAccordionItem.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>
0 голосов
/ 08 февраля 2012

В соответствии с вашим кодом 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...