【问题标题】:Unable to find control with id when using the panel RenderControl Method使用面板RenderControl方法时找不到带id的控件
【发布时间】:2026-01-09 17:05:02
【问题描述】:

我正在尝试在 asp.net 中动态创建一个表单,并通过对呈现的控件执行文本替换将其呈现在页面上。

(我不能只将控件推送到页面上的面板,这是理想的情况,我现在不会遇到这个问题)

我创建了一个标签、文本框和一个按钮,并将它们全部添加到一个面板中。然后使用 TextWriter 将该面板呈现为字符串,然后我使用它对我的副本执行替换。

    Label lbl = new Label();
    lbl.Text = "Enter Amount";
    lbl.Attributes.Add("style", "width:25%; vertical-align:middle;");
    lbl.CssClass = "donate-label";
    lbl.ID = "lblAmount";

    TextBox tb = new TextBox();
    tb.ID = "tbAmount";
    tb.Attributes.Add("style", "padding-left:25px; width:50%;");

    lbl.AssociatedControlID = tb.ID;

    Button b = new Button();
    b.ID = "btnDonate";
    b.Text = "Make a Donation";
    b.CssClass="block-btn right-arrow red-bg right";
    b.Click += new EventHandler(btnDonate_Click);
    b.Attributes.Add("style", "display:table-cell; margin-top:0; width:40% !important;");

    Panel pnlForm = new Panel();
    pnlForm.CssClass="form clearfix donate-form";
    pnlForm.Attributes.Add("style", "width:70%");

    pnlForm.Controls.Add(lbl);
    pnlForm.Controls.Add(tb);
    pnlForm.Controls.Add(b);

现在,如果我要将上述面板添加到页面上已经存在的面板中,它会按预期完美运行,但控件渲染会导致它在某处中断..

    TextWriter myTextWriter = new StringWriter();
    HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);

    pnlForm.RenderControl(myWriter);

    string body = p.Copy.Replace("##donate##", myTextWriter.ToString());

我得到的错误如下:

无法找到与标签“lblAmount”关联的 ID 为“tbAmount”的控件。

第 146 行:pnlForm.RenderControl(myWriter);

如果我删除了我的标签的 assoicatedControlID,它可以正常工作,但不幸的是它会将我的标签呈现为我不需要的跨度,我需要将它呈现为具有“for”属性的标签。

【问题讨论】:

  • 默认 asp.net 将标签呈现为 span
  • 是的,如果您不希望它包含在任何跨度/其他标签中,请使用 Literal 控件。
  • 抱歉没有说清楚,我需要将它呈现为带有“for”属性的标签
  • 这确实应该有效。我只是遇到了类似的情况,并认为这可能是同样的问题,但后来我意识到我在标签内嵌套了一个复选框。当我把它放在标签旁边时,它就开始工作了。您是在初始 page_load 时收到错误,还是仅在回发时收到错误?

标签: c# asp.net webforms rendercontrol


【解决方案1】:

最简单的方法是使用带有html标签的文字

    Literal lbl = new Literal();
    lbl.Text = "<Label For='tbAmount' style='width:25%; vertical-align:middle;' class='donate-label' > Enter Amount </label>";
    lbl.ID = "lblAmount";

顺便说一下,将 tbAmount id 设为静态,这样您的文本框就不会得到任何不可预测的 id

    tb.ClientIDMode= System.Web.UI.ClientIDMode.Static

【讨论】:

    最近更新 更多