【发布时间】: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