【问题标题】:Is there a better way to access controls in an ITemplate than FindControl()?有没有比 FindControl() 更好的方法来访问 ITemplate 中的控件?
【发布时间】:2011-01-15 07:13:52
【问题描述】:

将控件添加到 UpdatePanel 后,仍然可以从包含页面的代​​码访问它。这是如何实现的?自定义控件开发人员可以这样做吗?

换句话说,如果我使用 ITemplate 接口开发模板控件,有没有办法将它连接起来(就像 UpdatePanel 似乎一样),以便(以声明方式)包含的任何控件也可以从包含页面访问?

【问题讨论】:

    标签: asp.net code-behind itemplate custom-controls


    【解决方案1】:

    您可以在您的 ITemplate 属性上添加TemplateInstanceAttribute 来实现这一点,它具有将控件提升到页面级别的效果:

    [TemplateInstance(TemplateInstance.Single)]
    public ITemplate AnonymousTemplate {
      get { ... }
      set { ... }
    }
    

    来自 MSDN:

    TemplateInstanceAttribute 类允许您将模板属性标记为允许单个或多个实例化的模板属性。仅允许单个实例化的模板可以引用其中包含的控件。 ZoneTemplate 属性是只能实例化一次的属性示例。

    【讨论】:

    • 谢谢尼克,这是有用的信息——我不知道。那么,即使您可以在一个页面上拥有多个 UpdatePanel 控件,您是否了解 UpdatePanel 如何允许引用控件?
    • @James - 虽然你可以有多个 UpdatePanel 控件(或任何 ITemplate 父级),但在这种情况下 每个 只能有一个 ITemplate 子级,例如使用 UpdatePanel,您不能在同一个面板中拥有 2 个 <ContentTemplate>,因此其中的控件不会出现两次,从而导致您的页面出现重复 ID 问题。
    • 我无法访问我的 ITemplate 控件中的控件。谁能给我一个例子?
    • 我知道这篇文章很古老,但我一直在研究一些遗留代码,不得不修复一个自定义控件以访问其模板中的控件。这个答案非常好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 2018-10-11
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多