Мне нужно написать пользовательский элемент управления, который можно использовать со следующим синтаксисом:
<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, что он переводит на этот конкретный синтаксис?
- Какой код я могу написать, который переведёт в синтаксис, приведенный в первом примере кода выше?