Я хотел бы сделать свой веб-элемент управления более читабельным в режиме дизайна, в основном я хочу, чтобы объявление тега выглядело так:
<cc1:Ctrl ID = "Value1" runat = "server">
<Values>string value 1</Value>
<Values>string value 2</Value>
</cc1:Ctrl>
Допустим, у меня есть частная переменная в коде позади:
List<string> values = new List<string>();
Итак, как я могу заставить мой пользовательский элемент управления заполнить частную переменную значениями, объявленными в разметке?
Извините, я должен был быть более откровенным. В основном мне нравится функциональность, которую предоставляет ITemplate (http://msdn.microsoft.com/en-us/library/aa719834.aspx)
Но в этом случае вам нужно знать во время выполнения, сколько шаблонов можно создать, т.е.
void Page_Init() {
if (messageTemplate != null) {
for (int i=0; i<5; i++) {
MessageContainer container = new MessageContainer(i);
messageTemplate.InstantiateIn(container);
msgholder.Controls.Add(container);
}
}
}
В данном примере разметка выглядит так:
<acme:test runat=server>
<MessageTemplate>
Hello #<%# Container.Index %>.<br>
</MessageTemplate>
</acme:test>
Это красиво и чисто, в нем нет префиксов тегов и т. д. Мне действительно нужны красивые чистые теги.
Я, наверное, глупо хочу, чтобы разметка была чистой, мне просто интересно, есть ли что-то простое, чего мне не хватает.





Я вижу два варианта, но оба зависят от вашего веб-элемента управления, реализующего какую-то коллекцию для ваших значений. Первый вариант - просто использовать коллекцию элемента управления вместо вашей частной переменной. Другой вариант - скопировать коллекцию элемента управления в вашу частную переменную во время выполнения (например, в обработчике событий Page_Load).
Допустим, у вас есть веб-элемент управления, который реализует набор элементов, например список. Тег выглядит так в исходном виде:
<asp:ListBox ID = "ListBox1" runat = "server">
<asp:ListItem>String 1</asp:ListItem>
<asp:ListItem>String 2</asp:ListItem>
<asp:ListItem>String 3</asp:ListItem>
</asp:ListBox><br />
Затем вы можете использовать такой код для загрузки своей частной переменной:
List<String> values = new List<String>();
foreach (ListItem item in ListBox1.Items)
{
values.Add(item.Value.ToString());
}
Если вы сделаете это в Page_Load, вы, вероятно, захотите выполнить только при начальной загрузке (т.е. не при обратной передаче). С другой стороны, в зависимости от того, как вы ее используете, вы можете просто использовать коллекцию ListBox1.Items вместо объявления и инициализации переменной значений.
Я не могу придумать, как сделать это декларативно (так как ваш список в любом случае не будет создан до времени выполнения).
Я думаю, что вы ищете атрибут:
[PersistenceMode(PersistenceMode.InnerProperty)]
Помните, что вы должны зарегистрировать свое пространство имен и префикс с помощью:
<%@ Register Namespace = "MyNamespace" TagPrefix = "Pref" %>