Web控件属性

时间:2008-09-15 04:38:47

标签: c# asp.net

我想在设计模式下使我的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

但在这种情况下,您需要在运行时知道可以实现多少个模板,即

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 个答案:

答案 0 :(得分:2)

我认为您要搜索的是属性:

[PersistenceMode(PersistenceMode.InnerProperty)]

Persistence Mode

请记住,您必须使用以下命令注册您的命名空间和前缀:

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

答案 1 :(得分: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变量。

我认为没有办法以声明方式执行此操作(因为无论如何您的列表都不会在运行时实例化)。