我有一个非常简单的自定义控件,我在下面定义:
public class TestCtrl : WebControl
{
protected override void OnInit(EventArgs e)
{
var btn = new Button() { ID = "test", Text = "text"};
this.Controls.Add(btn);
}
}
但是,当我希望将它们的多个实例放在同一页面上时,我得到......
'具有相同ID的多个控件'测试'被发现了。
...点击btn
时。
protected void Page_Init(object sender, EventArgs e)
{
var ctrl1 = new TestCtrl() { ID = "ctrl1" };
plc.Controls.Add(ctrl1);
var ctrl2 = new TestCtrl() { ID = "ctrl2" };
plc.Controls.Add(ctrl2);
}
有没有一种干净的方法来阻止这种情况发生?我已经尝试将ClientIDMode设置为' Auto'没有任何成功,因为两个按钮上呈现标记的name
属性为"test"
。
编辑:通过添加' INamingContainer'解决。控制
public class TestCtrl : WebControl, INamingContainer{...}
答案 0 :(得分:2)
编辑:解决方法是将'INamingContainer'添加到控件公共类TestCtrl:WebControl,INamingContainer {...}
答案 1 :(得分:0)
因为您在OnInit方法中指定了btn的ID等于“test”,因此当您将控件添加到页面时它为控件设置ID = test。我认为没有必要在OnInit()方法中设置ID属性。将以下代码添加到渲染方法
protected override void OnInit(EventArgs e)
{
var btn = new Button() { Text = "text"}; // No need to add ID property
this.Controls.Add(btn);
}
答案 2 :(得分:0)
你走错了路。
public class TestCtrl : WebControl, INamingContainer {
private button btn;
[Bindable(true), Category("Content"), DefaultValue(""), Description("Gets or Sets the Fields that are to be added to the ListItems")]
public string TextField {
get { EnsureChildControls(); return btn.Text; }
set { EnsureChildControls(); btn.Text = value; }
}
[Bindable(true), Category("Content"), DefaultValue(""), Description("Gets or Sets another field of your choice")]
public string SomeStringField{
get { return ViewState["_someStringField"] != null ? ViewState["_someStringField"].ToString() : String.Empty ; }
set { ViewState["_someStringField"] = value; }
}
protected override void OnInit(EventArgs e) {
base.OnInit(e);
}
protected override void CreateChildControls() {
btn = new button();
btn.id = "btn";
this.Controls.Add(btn);
}
protected override void Render(HtmlTextWriter writer) {
writer.Write(<b>SomeStringField + ":</b>");
btn.RenderControl(writer);
}
}
将其添加到您的网页后
这将显示一个标签,然后是旁边的按钮。您希望在CreateChildControls中使用id,以便为其分配唯一ID。 EnsureChildControls将确保正确加载属性。您可以从控件中的任何位置调用此方法,但我会在OnInit之后执行此操作。如果没有,那么Id会被混淆。有时他们会工作,有些人则不工作。 Jquery的Javascript也会给你一个头痛。
我会参考微软的例子。他们有很多,非常有帮助。