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

Мне нужно написать пользовательский элемент управления, который можно использовать со следующим синтаксисом:

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

Литеральное содержимое ('Foo') не допускается в 'System.String []'.

Я изучал в Reflector, который наследуется от ListControl , который объявляет свойство Items следующим образом:

ParseChildren(true, "Items")
public abstract class ListControl
{
  [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
  public virtual ListItemCollection Items { get; }
}

Это не совсем то, что я хочу, потому что в DropDownList вы должны добавить как дочерние элементы.И есть кое-что, чего я не понимаю в дизайне элементов управления, что в настоящее время мешает мне найти решение:

  • Почему тег не требует runat = "server" атрибут?
  • Могу ли я объявить такой «элемент управления»?
  • Что такого особенного в ListItemCollection, что он преобразуется в этот конкретный синтаксис?
  • Какой код я могу написать, который будет преобразован в синтаксис, приведенный в первом примере кода выше?
12
задан Michiel van Oosterhout 19 January 2012 в 20:35
поделиться