Asp.net 自定义网络控制和回发

Asp.net 自定义网络控制和回发,asp.net,web-controls,Asp.net,Web Controls,我正在尝试创建一些自定义web控件来包装一些现有控件。例如,其中之一是文本框的换行符(因为我需要其他行为,如相应的验证器)。问题是,我不确定如何获取该控件的数据以在回发中发送 一个非常简单的例子: public class MyTestBox: WebControl { protected TB { get; set; } public Text { get { return TB.Text; } set { TB.Text = value; } } protected over

我正在尝试创建一些自定义web控件来包装一些现有控件。例如,其中之一是文本框的换行符(因为我需要其他行为,如相应的验证器)。问题是,我不确定如何获取该控件的数据以在回发中发送

一个非常简单的例子:

public class MyTestBox: WebControl
{
protected TB { get; set; }
public Text
{
    get { return TB.Text; }
    set { TB.Text = value; }
}
protected override void CreateChildControls()
{
TB= new TextBox()
Controls.Add(TB);
}
}
但如果我现在使用控件测试webform:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<bleh:MyTextBox ID="MyTextBox1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Submit" />
protected override void OnInit(EventArgs e)
{
    TB.ID = this.ID + "_TextBox1";
    Controls.Add(TB);
    if (Page.Request.Form[TB.UniqueID] != null)
    {
         Text = Page.Request.Form[TB.UniqueID];
    }
}

它似乎在工作,但感觉有点不舒服。这看起来合理吗?

您应该给动态生成的文本框一个ID,然后在控件的Text属性上找到文本框并返回其文本

public class BksTextBox: WebControl
{
protected TB { get; set; }
public Text
{
    get 
    { 
       return ((TextBox)this.FindControl("txt")).Text;
    }
}
protected override void CreateChildControls()
{
TB= new TextBox()
TB.ID = "txt";
Controls.Add(TB);
}
}

我不明白你的问题。 如果您需要向web控件添加一些额外的行为,那么您应该执行与希望扩展类行为(即继承)时相同的操作。 您可以从TextBox类继承straigh格式,并添加所需的所有额外行为

 public class BksTextBox: TextBox
  {
    //it is just as example
    public string TextToUpperCase
    {
    get
      {
       return Text.ToUpperCase();
       }
     }

}

这可能与页面生命周期有关。尝试在文本属性getter中使用this.ensureChildControl()。有关页面生命周期的更多信息,请参见。

但如何将其连接到实际的文本框,当用户更改文本并提交时,ViewState[“text”]会更新?这仍然不起作用,因为在用户输入文本然后提交的过程中,文本属性集未被访问,因此ViewStart条目为空。它是从System.Web.UI.Textbox继承的选项吗?如果是这样的话,你就不会关心文本属性,你会关注你想添加的任何功能。在这种情况下,这是一个选项,我可能会这样做。另一方面,还有一些更复杂的控件也有类似的问题,问题更大,最好还是坚持我在编辑中添加的方式。