我正在创建一个位于aspx
页面的服务器控件。当用户选择菜单选项时,将动态添加html控件(选择,输入等)。我可以使用用户控件来完成它,但我不确定如何在服务器控件中进行此操作。
任何人都可以告诉我如何将动态html添加到控件之后它已经位于页面中了吗?
答案 0 :(得分:2)
由于您计划添加多个控件作为服务器控件的输出,因此您应该考虑继承自CompositeControl,此控件旨在与多个组成控件一起使用,从而最大限度地减少执行常见操作所需的代码保持状态和处理组成控制事件
您需要覆盖CreateChildControls以添加子控件。在此方法结束时,您应使用this.ChildControlsCreated = true;
指定是否已创建子控件,这是必要的,因为在ASP.Net page life-cycle期间多次调用CreateChildControls
您需要应用通常应用于任何服务器控件的相同规则,例如,实现INamingContainer接口以确保子控件具有唯一的客户端ID
这是一个简单的例子:
[DefaultProperty("UserText")]
[ToolboxData(@"<{0}:UserPassword runat=server UserText="""" PasswordText="""" />")]
public class UserPassword : CompositeControl
{
public event EventHandler Submitted = delegate { };
[Bindable(true)]
[Category("Appearance")]
[Description("User text")]
[DefaultValue("")]
[Localizable(true)]
public string UserText
{
get
{
var t = this.FindControl("Username") as TextBox;
return t.Text;
}
set
{
var t = this.FindControl("Username") as TextBox;
t.Text = value;
}
}
[Bindable(true)]
[Category("Appearance")]
[Description("Password text")]
[DefaultValue("")]
[Localizable(true)]
public string PasswordText
{
get
{
var t = this.FindControl("Password") as TextBox;
return t.Text;
}
set
{
var t = this.FindControl("Password") as TextBox;
t.Text = value;
}
}
protected override void CreateChildControls()
{
var p = new Panel { Width= new Unit(200), BackColor = Color.Silver };
var ul = new Label { Text = "Username: " };
var u = new TextBox { ID = "Username" };
var pal = new Label { Text = "Password: " };
var pa = new TextBox { ID = "Password", TextMode = TextBoxMode.Password };
var l = new Literal { Text = "<br />" };
var b = new Button { Text = "Log in" };
b.Click += (x, y) => this.Submitted(x, y);
p.Controls.Add(ul);
p.Controls.Add(u);
p.Controls.Add(l);
p.Controls.Add(pal);
p.Controls.Add(pa);
p.Controls.Add(l);
p.Controls.Add(l);
p.Controls.Add(b);
this.Controls.Add(p);
this.ChildControlsCreated = true;
}
}