2008-09-15 1 views
1

Я хотел бы сделать мой веб-контроль более удобным для чтения в режиме разработки, в основном я хочу, чтобы декларация тег выглядеть следующим образом:Свойства веб-управления

<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)

Но в этом случае вы должны знать, во время выполнения, сколько шаблонов может быть instansitated, т.е.

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> 

Какой красивый и чистый, он не имеет каких-либо тегов префиксы и т.д. Я действительно хочу, чтобы хорошо чистые метки.

Я, наверное, глупый, хочу, чтобы разметка была чистой, мне просто интересно, есть ли что-то простое, что мне не хватает.

ответ

2

Я думаю, что вы ищете это атрибут:

[PersistenceMode(PersistenceMode.InnerProperty)] 

Persistence Mode

Помните, что вы должны зарегистрировать пространство имен и префикс:

<%@ Register Namespace="MyNamespace" TagPrefix="Pref" %> 
0

Я вижу два варианта, но оба зависят от вашего веб-элемента управления, реализующего какую-то коллекцию для ваших значений. Первый вариант - просто использовать коллекцию элемента управления вместо вашей частной переменной. Другой вариант - скопировать коллекцию элемента управления в вашу личную переменную во время выполнения (например, в обработчике событий 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 вместо объявления и инициализации переменной значений.

Я не думаю, что это невозможно сделать декларативно (так как ваш список не будет создан до начала выполнения).

Смежные вопросы