首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问ASP.NET ITemplate容器属性

如何访问ASP.NET ITemplate容器属性
EN

Stack Overflow用户
提问于 2021-10-22 13:18:27
回答 1查看 41关注 0票数 0

我正在尝试学习如何使用ITemplate来实现更好的自定义控件。我已经让它大部分工作了,但是我还不能弄清楚如何从页面访问容器的任何属性。

下面是我的模板化控件:

代码语言:javascript
复制
[ParseChildren(true)]
[PersistChildren(false)]
public partial class Example : UserControl
{
    private ITemplate _CustomPanelContainer;

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateContainer(typeof(CustomPanelContainer))]
    [TemplateInstance(TemplateInstance.Single)]
    public virtual ITemplate CustomPanel
    {
        get { return _CustomPanelContainer; }
        set { _CustomPanelContainer = value; }
        
    }


    protected override void CreateChildControls()
    {
        Controls.Clear();
        if (_CustomPanelContainer != null)
        {
            var p = new Panel();
            p.ID = "CustomPanel";
            Controls.Add(p);
            _CustomPanelContainer.InstantiateIn(p);
        }
        base.CreateChildControls();
    }


    public class CustomPanelContainer : Panel, INamingContainer 
    {
        
        private string _Test = "TESTING!";
        public string TextTest 
        { 
            get 
            { 
                return _Test;
            }
            set
            {
                _Test = value;
            }
        }
    }
}

下面是页面实现:

代码语言:javascript
复制
<uc1:Example runat="server" ID="Example1">
        <CustomPanel>
            <strong>Test: </strong> <%# Container.TextTest %>
        </CustomPanel>
    </uc1:Example>

它在很大程度上是有效的,但问题是<%# Container.TextTest %>总是返回一个空字符串。当我在调试器上运行它时,我在CustomPanelContainer的TextTest属性内的行上放置了一个断点,断点永远不会命中,因此实际上永远不会访问该属性。

这里我漏掉了什么?如何通过<%#Container访问容器的公共属性?

EN

回答 1

Stack Overflow用户

发布于 2021-10-22 17:46:28

我终于想出了如何让它按照我想要的方式运行。

我删除了ITemplate作为容器的类型,将类型设置为实际的类型,并向CreateChildControls()添加了一个DataBind()命令。

也许这不是正确的方法,但它是有效的。

让这个问题开放一段时间,看看是否有人提出了任何批评或更好的方法,因为我真的不知道我在这里做什么。

简化的工作代码:

代码语言:javascript
复制
[ParseChildren(true)]
[PersistChildren(false)]
public partial class Example : UserControl
{

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateInstance(TemplateInstance.Single)]
    public virtual CustomPanelContainer Template { get; set; }


    protected override void CreateChildControls()
    {
        Controls.Clear();
        if (Template != null)
        {
            Template.DataBind();
            Controls.Add(Template);
        }
        base.CreateChildControls();
    }

    

    public class CustomPanelContainer : Panel, INamingContainer
    {
        public string TextTest
        {
            get { return "TESTING!"; }
        }
    }
}

页面实现:

代码语言:javascript
复制
<uc1:Example runat="server" ID="Example">
    <Template>
        <strong>Test: </strong><span><%# Container.TextTest %></span>
    </Template>
</uc1:Example>

编辑:当需要隐藏模板的类型时,这也是有效的。也就是说,上面的代码公开了模板的类型,以允许操作Panel的属性作为模板的属性,而下面的代码隐藏了模板的类型,以阻止对其属性的操作。

代码语言:javascript
复制
[ParseChildren(true)]
[PersistChildren(false)]
public partial class Example : UserControl
{

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateInstance(TemplateInstance.Single)]
    [TemplateContainer(typeof(CustomPanelContainer))]
    public virtual ITemplate Template { get; set; }


    protected override void CreateChildControls()
    {
        Controls.Clear();
        if (Template != null)
        {
            var p = new CustomPanelContainer();
            Template.InstantiateIn(p);
            p.DataBind();
            Controls.Add(p);
        }
        base.CreateChildControls();
    }

    

    public class CustomPanelContainer : Panel, INamingContainer
    {
        public string TextTest
        {
            get { return "TESTING!"; }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69677598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档