Как предоставить пользовательскому элементу управления ASP.NET возможность анализировать XML-разметку в коллекции?

Я пишу собственный веб-элемент управления ASP.NET и хотел бы, чтобы он имел набор пользовательских элементов, которые также можно указать в разметке XML. Что-то вроде этого:

class MyControl: WebControl
{
    public IList<MyItemType> MyItems { get; private set; }
}

И в разметке:

<asd:MyControl runat="server" id="mc1">
    <MyItems>
        <MyDerivedCustomItem asd="dsa"/>
        <MyOtherDerivedCustomItem asd="dsa"/>
    </MyItems>
</asd:MyControl>

Как мне это сделать? Хотя я думал, что все дело в реализации некоторого интерфейса в коллекции или добавлении некоторых специальных атрибутов к свойству, но ничего из того, что я делаю, похоже, не работает.


person Vilx-    schedule 01.04.2010    source источник


Ответы (2)


Ха, понял!

Кажется, что IList<T> - плохой тип для возврата. Это должно быть что-то, что реализует старый добрый IList. Хотя реализация может быть явной. Предоставление переопределений методов с теми же именами, но строго типизированными аргументами ограничит доступные параметры в редакторе разметки.

Ну и конечно добавление стандартных атрибутов тоже кажется необходимым:

[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[MergableProperty(false)]

Не уверен, что они все делают (во многих местах документация довольно неинформативна), но это работает!

person Vilx-    schedule 01.04.2010

Возможно, эта статья MSDN даст вам преимущество: http://msdn.microsoft.com/en-us/library/9txe1d4x.aspx

Одним из важных атрибутов, на который следует обратить внимание, является:
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
, который даст желаемый эффект...

ХТН.

person Sunny    schedule 01.04.2010
comment
Извините, таких коллекций у меня будет как минимум две, поэтому InnerDefaultProperty не подойдет. InnerProperty будет, но это не работает как таковое (хотя мне удалось его взломать, ждите моего ответа). - person Vilx-; 01.04.2010