Мне нужно написать пользовательский элемент управления, который можно использовать со следующим синтаксисом:
<quiz:Question runat="server">
<Answer>Foo</Answer>
<Answer>Bar</Answer>
</quiz:Question>
Я пробовал следующее объявление свойства:
[ParseChildren(true, "Answer")]
public class Question : UserControl
{
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public string[] Answer { get; set; }
}
Но тогда редактор Visual Studio настаивает на том, что <Answers >
должен быть самозакрывающимся, и я получаю это исключение, если я решу иначе:
Литеральное содержимое ('Foo') не допускается в 'System.String []'.
Я смотрел на <asp:DropDownList>
в Reflector, который наследуется от ListControl
, который объявляет свойство Items
следующим образом:
ParseChildren(true, "Items")
public abstract class ListControl
{
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public virtual ListItemCollection Items { get; }
}
Это не совсем то, что я хочу, потому что в DropDownList
вы должны добавить <asp:ListItem>
как дети. И есть некоторые вещи, которые я не понимаю в дизайне элементов управления, которые в настоящее время мешают мне найти решение:
- Почему для тега
<asp:ListItem>
не требуется атрибут runat="server"
?
- Могу ли я объявить такой «контроль»?
- Что такого особенного в коллекции ListItemCollection, что она переводит в этот конкретный синтаксис?
- Какой код я могу написать, который будет преобразован в синтаксис, приведенный в первом примере кода выше?