【问题标题】:How can I add dynamic html to a server control?如何将动态 html 添加到服务器控件?
【发布时间】:2012-07-27 13:25:06
【问题描述】:

我正在创建一个位于aspx 页面中的服务器控件。当用户选择菜单选项时,将动态添加 html 控件(选择、输入等)。我可以使用用户控件来做到这一点,但我不确定如何在服务器控件中进行操作。

谁能告诉我如何在控件中添加动态 html 到页面中?

【问题讨论】:

    标签: asp.net html .net-3.5 custom-server-controls


    【解决方案1】:

    由于您计划添加多个控件作为服务器控件的输出,您应该考虑从CompositeControl 继承,该控件旨在与多个组成控件一起使用,从而最大限度地减少执行常见操作(例如保持状态)所需的代码并处理组成控制事件

    您需要覆盖CreateChildControls 以添加子控件。在这个方法的最后,你应该使用this.ChildControlsCreated = true;来指定是否创建了子控件,这是必要的,因为CreateChildControlsASP.Net page life-cycle期间被多次调用

    您需要应用通常应用于任何服务器控件的相同规则,例如实现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;
        }
    }
    

    【讨论】:

    • 我猜这是可以继承的,就像服务器控件一样?
    • 是的。这是一个服务器控件。创建服务器控件时,您可以继承 ControlWebControlCompositeControl 或任何特定控件,例如 TextBoxButton
    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2011-10-09
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多