【问题标题】:Error with templated control with attribute [TemplateInstance(TemplateInstance.Single)] inside FormViewFormView 中带有属性 [TemplateInstance(TemplateInstance.Single)] 的模板化控件出错
【发布时间】:2011-12-01 07:36:20
【问题描述】:

我创建了一个具有单个 ContentTemplate 的自定义控件,我在其中使用 [TemplateInstance(TemplateInstance.Single)] 属性修饰了 ITemplate 属性,以使内部的所有控件直接可用,而无需使用 FindControl 来访问它们。

但是,如果我根据以下内容在 Formviews InsertItemTemplate 和 EditItemTemplate 中使用我的控件...

<asp:FormView runat="server" ID="formView">
    <InsertItemTemplate>
        <my:Control runat="server" ID="myControl">
            <ContentTemplate>
                <asp:TextBox runat="server" ID="textBox" />
            </ContentTemplate>
        </my:Control>
    </InsertItemTemplate>
    <EditItemTemplate>
        <my:Control runat="server" ID="myControl">
            <ContentTemplate>
                <asp:TextBox runat="server" ID="textBox" />
            </ContentTemplate>
        </my:Control>
    </EditItemTemplate>
</asp:FormView>

...我收到一条错误消息,因为我的 ContentTemplate 中的两个文本框(或任何其他控件)具有相同的 ID:

“XXX 类已经包含了 textBox 的定义”

我觉得这很奇怪,因为 FormView 的 InsertItemTemplate 和 EditItemTemplate 没有用提到的属性装饰,所以里面的所有控件都应该在它们的模板范围内。上面示例中的 ID“myControl”也是如此,不会产生冲突...

有人知道如何解决这个问题吗?现在我可以在模板中使用不同的 ID:s,但我希望它按原样工作,因为这些 FormView 模板中的控件具有相同的 ID:s 很常见。

【问题讨论】:

标签: asp.net custom-controls webforms controltemplate


【解决方案1】:

我知道这已经晚了,但是当您定义 TemplateInstance.Single 时,框架允许直接引用控件,因此 ID 必须是唯一的。因此,您不需要FindControl(),但您还需要一个唯一的ID 来引用。像 ListView 这样的控件,它有一个 ItemTemplate,使用TemplateInstance.Multiple。这就是某些模板因行为而异的原因。

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多