Пользовательский элемент управления ASP.NET меню - PullRequest
2 голосов
/ 28 ноября 2010

Я работаю над пользовательским элементом управления меню, частично как учебное упражнение, и у меня возникают проблемы с поддержкой IntelliSense в 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 Ответ

1 голос
/ 01 декабря 2010

Во многом благодаря сообщению в блоге, которое я запоздало обнаружил ( ParseChildren PersistChildren и 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 достигает того же поведения без использования этого атрибута.

...