0

我正在尝试将带有.ascx 标记的asp.net 用户控件重新设计为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"and生成 DropDownList name="ctl00$MainContent$ComboBox1$Source"。名称按预期生成,但 Id 错误,这里应该是_而不是$

我怎样才能实现id="MainContent_ComboBox1_Source"name="ctl00$MainContent$ComboBox1$Source"

更新 1。

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

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
4

1 回答 1

1

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

简而言之 - 如果您想保留重做控件的值ClientID和值,您应该使用与标记Name完全相同的控件树。.ascx

于 2013-05-10T11:35:48.797 回答