2012-02-08 70 views
0

我想創建一個類似下面的服務器控件:
在asp.net中創建嵌套的ServerControl?

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

我該怎麼辦呢?

回答

0

我能解決這個問題

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

根據你的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> 
+0

我不希望有CC1子控件中的前綴,我該怎麼做? – 2012-02-08 12:12:29

+0

您可能無法做任何有關cc1的事情,因爲這些控件在註冊爲cc1 – 2012-02-08 13:44:16

+0

的程序集中使用,對不起,我錯誤地理解了您的原始問題。 @ O.Askari是對的。自從那裏以來,你無法對cc1做任何事情來防止含糊不清。 – Nandun 2012-02-09 06:28:44