【问题标题】:Creating nested ServerControl in asp.net?在 asp.net 中创建嵌套的 ServerControl?
【发布时间】:2012-02-08 07:47:54
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

    标签: c# asp.net custom-server-controls servercontrols


    【解决方案1】:

    根据你的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>
    

    【讨论】:

    • 我不想在子控件中有cc1前缀,怎么办?
    • 您可能无法对 cc1 执行任何操作,因为这些控件用于注册为 cc1 的程序集中
    • 对不起,我误解了你原来的问题。 @O.Askari 是对的。你不能对 cc1 做任何事情,因为它在那里以防止任何歧义。
    【解决方案2】:

    我可以解决问题

    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>
    

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 2023-03-26
      • 2011-05-06
      相关资源
      最近更新 更多