【问题标题】:Wrong ClientID for dynamically added child control动态添加的子控件的 ClientID 错误
【发布时间】:2013-05-10 11:26:30
【问题描述】:

我正在尝试将带有 .ascx 标记的 ascx 用户控件重新设计为 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。

尝试按照 Knaģis 的建议将 DropDownList 放入面板:

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

【问题讨论】:

  • 我不知道。 Control.ClientIDSeparator "总是返回下划线字符(_)"。
  • 比我有 d="MainContent_ComboBox1_Source" 和 name="ctl00$MainContent$ComboBox1_Source"

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


【解决方案1】:

您应该添加一个 ID 为 ComboBox1 的子面板(或另一个容器控件),然后在其中添加 ID 为 SourceDropDownList。让 ASP.NET 生成分层标识符。

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

【讨论】:

  • 我没有考虑到这一点,因为在原始 .ascx 中我有 在文件的根目录中,它会生成具有正确 id 和名称且没有父容器。
  • ASP.NET 是否自行生成此 ID?我按照您的建议尝试了面板,但没有成功(请参阅更新 1。)。我什至尝试手动将 ClientIDMode 设置为 Predictable
  • 尝试创建这样的面板控件:public class ContainerPanel : Panel, INamingContainer { }
  • 哦不。太愚蠢了=(有趣,但我在周二通过的70-515考试中对INamingContainer提出了疑问=))Liels paldies,Knaģis。
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2011-01-18
相关资源
最近更新 更多