【问题标题】:ASP.NET Custom control with content templates带有内容模板的 ASP.NET 自定义控件
【发布时间】:2012-09-27 09:56:40
【问题描述】:

我在 ASP.NET 3.5 中创建了 LoginView ASP.NET 控件的“克隆”,以满足我们公司的需要,并且我试图了解它如何实现在不同模板中设置具有相同 ID 的控件的能力。 例如,这是带有 LoginView 控件的 ASPX 标记:

    <asp:LoginView ID="lv" runat="server">
        <AnonymousTemplate>
            <asp:Label ID="lbl" runat="server" />
        </AnonymousTemplate>
        <LoggedInTemplate>
            <asp:Label ID="lbl" runat="server" />
        </LoggedInTemplate>
    </asp:LoginView>

这是有效的标记,页面工作正常。
现在我创建了我的自定义控件:

    [ParseChildren(true)]
    [PersistChildren(false)]
    public class ContentControl : Panel
    {
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public PlaceHolder AnonymousView { get; set; }

        [PersistenceMode(PersistenceMode.InnerProperty)]
        public PlaceHolder LoggedinView { get; set; }

        public ContentControl()
        {
            this.Init += new EventHandler(ContentControl_Init);
        }

        void ContentControl_Init(object sender, EventArgs e)
        {
            if (AnonymousView == null)
            {
                AnonymousView = new PlaceHolder();
            }

            if (LoggedinView == null)
            {
                LoggedinView = new PlaceHolder();
            }

            this.Controls.Add(AnonymousView);
            this.Controls.Add(LoggedinView);

            AnonymousView.ID = "AnonymousView";
            LoggedinView.ID = "LoggedinView";

            AnonymousView.Visible = !MyContext.IsLogged;
            LoggedinView.Visible = MyContext.IsLogged;
        }
    }

现在,当我使用带有以下标记的控件时,我收到 ID 为“lbl”的控件在页面上存在多次的错误:

    <TL:ContentControl ID="c" runat="server" CssClass="dd">
        <AnonymousView>
            AnonymousView
            <asp:Label ID="lbl" runat="server" />
        </AnonymousView>
        <LoggedinView>
            LoggedinView
            <asp:Label ID="lbl" runat="server" />
        </LoggedinView>
    </TL:ContentControl>

如何允许在两个模板中拥有相同 ID 的控件?

【问题讨论】:

    标签: c# asp.net user-controls custom-controls


    【解决方案1】:

    需要开发模板化控件:Building Templated Custom ASP.NET Server Controls

    并使用实现 INamingContainer 作为模板容器的控件:Use TemplateInstance.Single to avoid FindControls

    【讨论】:

    • 谢谢,这正是我要找的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多