自定义控件的子控件无法正确呈现

时间:2012-11-21 00:29:08

标签: c# asp.net controls render

我正在添加一些控件作为我开发的另一个自定义控件的子控件。这是我添加子控件的位置(自定义标签和通用跨度控件):

    public static void AddLabel(this IExtendedControl control, string inheritableCssClass = "")
    {
        TestCLabel contentLabel = new TestCLabel();
        contentLabel.Text = control.LabelText;
        control.Controls.Add(contentLabel);
        if (control.Required)
        {
            HtmlGenericControl requiredFieldIndicator = new HtmlGenericControl("span");
            requiredFieldIndicator.Attributes["class"] = "requiredFieldIndicator";
            requiredFieldIndicator.InnerText = " *";
            control.Controls.Add(requiredFieldIndicator);
        }

然后我在父控件的render方法中执行以下操作:

    protected override void Render(HtmlTextWriter w)
    {
        base.Render(w);

        foreach (Control c in this.Controls)
        {
            c.RenderControl(w);
        }

        if (Required)
        {
            rfv.RenderControl(w);
        }
    }

但是我收到错误'具有相同密钥的条目已存在'。这是由手动呈现子控件的尝试引起的。我认为我不需要进行手动渲染,但在我编码之前,控件中没有出现(HTML标记中没有任何内容)。有什么想法正在发生什么?

1 个答案:

答案 0 :(得分:-1)

看起来儿童控件的手动渲染不是问题。我重写了代码 因为我最初将子控件分配给父控件的属性,但更改了此操作以将子控件添加到父控件的控件集合中(以便子控件现在经历正确的生命周期)。我之前一直在手动渲染子控件,当它们是父控件的属性时,仍在执行此操作。手动渲染所有子项时,第二次添加控件。仍然没有回答:

  • 为什么手动添加是必要的,因为这应该是自动的?