自定义ASP.NET菜单控件

时间:2010-11-28 10:13:39

标签: asp.net controls menu

我正在开发一个自定义菜单控件,部分是作为一个学习练习,我在Visual Studio的标记视图中支持它时遇到了麻烦。

传统的ASP.NET菜单允许您在<asp:MenuItem/>元素下放置任意深度的<Items>...</Items>元素。我对我的菜单采取了同样的行为。

不幸的是,我没有。 VS坚持使用空标签:

<hn:AwesomeMenu runat="server" ID="menu">
    <Items />
</hn:AwesomeMenu>

我已经使用Reflector挖掘ASP.NET Menu控件及其相关的类(MenuItem,MenuItemCollection和soforth),并确保我的类具有相同的接口和属性,所以我有点难过到哪里我我出错了。到目前为止我的课程的存根如下:

AwesomeMenu.cs

public class AwesomeMenu
    : HierarchicalDataBoundControl,
      IPostBackEventHandler,
      INamingContainer
{
    [PersistenceMode(PersistenceMode.InnerProperty),
     MergableProperty(false),
     DefaultValue(default(string)),
     Browsable(false)]
    public AwesomeCollection Items
    {
        get { ... }
    }
}

AwesomeCollection.cs

public class AwesomeCollection
    : ICollection,
      IEnumerable,
      IStateManager
{ ... }

AwesomeItem.cs

[ParseChildren(true, "Children")]
public class AwesomeItem
    : IStateManager,
      ICloneable
{
    [PersistenceMode(PersistenceMode.InnerDefaultProperty),
     MergableProperty(false)]
    public AwesomeCollection Children
    {
        get { ... }
    }

    public AwesomeItem Parent
    {
        get { ... }
    }
}

为简洁起见,省略了接口实现。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

在很大程度上要归功于我发现的一篇博文(The ParseChildren PersistChildren and PersistenceMode.InnerProperty),我能够围绕上述属性的适当用法。

基本上我只需要菜单类本身的[ParseChildren(...)]属性。所需行为的最小成功实现如下:

<强> Menu.cs

[ParseChildren(ChildrenAsProperties = true)]
public class Menu
    : Control
{
    [PersistenceMode(PersistenceMode.InnerProperty),
     Browsable(false)]
    public List<Item> Items { get; set; }
}

<强> Item.cs

[ParseChildren(
    typeof(Item),
    DefaultProperty = "Items",
    ChildrenAsProperties = true)]
public class Item
{
    public string Text { get; set; }

    [Browsable(false)]
    public List<Item> Items { get; set; }
}

我唯一的问题是ASP.NET菜单如何在不使用此属性的情况下实现相同的行为。