Web控件属性

时间:2020-03-05 18:53:09  来源:igfitidea点击:

我想让我的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/zh-cn/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>

很好,很干净,它没有任何标签前缀等。我真的想要很好的干净标签。

我可能想让标记整洁,这很愚蠢,我只是想知道我是否缺少一些简单的东西。

解决方案

回答

我看到两个选项,但是都取决于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变量。

我无法想到以声明方式执行此操作(因为列表要等到运行时才能实例化)。

回答

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

[PersistenceMode(PersistenceMode.InnerProperty)]

持续模式

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

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