用于动态添加子控件的ClientID错误

时间:2013-05-10 11:26:31

标签: c# user-controls webforms parent-child web-controls

我正在尝试使用.ascx标记将asp.net usercontrol重新编写为WebControl(仅限.cs)。

在my_new_webcontrol.cs中我有:

private readonly DropDownList _source = new DropDownList();

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    _source.ID = String.Format("{0}{1}{2}", ID, IdSeparator, "Source");
    Controls.Add(_source);
}

protected override void Render(HtmlTextWriter writer)
{
    RenderContents(writer);
}

protected override void RenderContents(HtmlTextWriter writer)
{
    _source.RenderControl(writer);
}

问题是它使用id="MainContent_ComboBox1$Source"name="ctl00$MainContent$ComboBox1$Source"生成DropDownList。名称按预期生成但ID错误,此处应为 _ ,而不是 $

我如何实现id="MainContent_ComboBox1_Source"name="ctl00$MainContent$ComboBox1$Source"

更新1。

尝试将DropDownList放入Panel中Knaģis建议:

private readonly DropDownList _source = new DropDownList();
private readonly Panel _panel = new Panel();

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    _panel.ID = ID;
    _panel.Controls.Add(_source);
    Controls.Add(_panel);
}

protected override void Render(HtmlTextWriter writer)
{
    RenderContents(writer);
}

protected override void RenderContents(HtmlTextWriter writer)
{
    _panel.RenderControl(writer);
}

没有成功。生成的HTML(缺少ID和名称的ComboBox1):

<div id="MainContent_ComboBox1">
    <select name="ctl00$MainContent$Source" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MainContent$Source\',\'\')', 0)" id="MainContent_Source"></select>    
</div>

答案

由于Knaģis建议我在服务器控件类声明中错过了INamingContainer

public class ComboBox: WebControl, INamingContainer

1 个答案:

答案 0 :(得分:1)

您应该添加ID为ComboBox1的子面板(或其他容器控件),然后在其中添加ID为DropDownList的{​​{1}}。让ASP.NET生成分层标识符。

简而言之 - 如果您想为重新设计的控件保留SourceClientID的值,则应使用与Name标记完全相同的控制树。