2010-11-28 7 views
2

Je travaille sur un contrôle de menu personnalisé, en partie en tant qu'exercice d'apprentissage, et je rencontre des problèmes avec la prise en charge IntelliSense de Visual Studio en vue de balisage.Contrôle de menu ASP.NET personnalisé

Le menu ASP.NET classique vous permet de placer une profondeur arbitraire de <asp:MenuItem/> éléments sous l'élément <Items>...</Items>. Je suis après le même comportement pour mon menu.

Malheureusement, ce n'est pas le cas de la mine. VS insiste sur une balise vide:

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

Je l'ai utilisé réflecteur pour creuser dans le contrôle Menu ASP.NET et ses classes associées (MenuItem, MenuItemCollection et Soforth) et ont veillé à ce que mes classes ont les mêmes interfaces et attributs , donc je suis légèrement perplexe quant à l'endroit où je me trompe. Stubs de mes cours à ce jour sont les suivantes:

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 { ... } 
    } 
} 

Les implémentations d'interface sont omises par souci de concision. Toute aide serait appréciée.

Répondre

1

Merci en grande partie à un article de blog que j'ai découvert tardivement (The ParseChildren PersistChildren and PersistenceMode.InnerProperty), j'ai été en mesure d'envelopper la tête autour de l'utilisation appropriée des attributs susmentionnés.

Fondamentalement, je ne demandais qu'un attribut [ParseChildren(...)] dans la classe de menu elle-même. Une mise en œuvre réussie minimale du comportement souhaité est la suivante:

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

Ma seule question est de savoir comment le menu ASP.NET réalise le même comportement sans l'utilisation de cet attribut.

Questions connexes