2008-09-15 47 views
1

我想提出我的網頁控制在設計模式更可讀的,基本上我想要的變量聲明的樣子:Web控件屬性

<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

我看到兩個選項,但都取決於您的Web控件實現某種集合爲您的值。第一種選擇是隻使用控件的集合而不是私有變量。另一種選擇是在運行時將控件的集合複製到您的私有變量(例如,可能在Page_Load事件處理程序中)。

假設您擁有實現項目集合(如列表框)的Web控件。標籤看起來像這樣在源視圖:

<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集合而不是聲明和初始化values變量。

我可以想到沒有辦法做到這一點聲明式(因爲你的列表將不會實例化,直到運行時)。