【问题标题】:Custom WebControl and Postback自定义 WebControl 和回发
【发布时间】:2011-02-28 09:17:10
【问题描述】:

我正在尝试创建一些包含一些现有控件的自定义 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);
}
}

但如果我现在用控件测试一个网络表单:

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<bleh:MyTextBox ID="MyTextBox1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Submit" />

然后在文本框中输入文本并提交后,TextBox1中的文本在Page_Load中可用,而MyTextBox1.Text为空。在发送回发时,我应该更改哪些内容才能使其内容可用?

编辑:

我现在想到的就是在初始化控件的时候简单的检查一下请求表单:

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];
    }
}

它似乎工作正常,但感觉有点 hacky。这看起来是一种合理的方式吗?

【问题讨论】:

  • 是继承自 System.Web.UI.Textbox 的选项吗?如果是这样,您不会关心 Text 属性,您将专注于要添加的任何功能。
  • 在这种情况下这是一个选项,我可能会这样做。另一方面,还有一些更复杂的控件也有类似的问题,问题更大,坚持我在编辑中添加的方式可能会更好。

标签: asp.net web-controls


【解决方案1】:

你应该给动态生成的TextBox一个ID,然后在你的控件的Text属性上,你应该找到TextBox并返回它的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);
}
}

【讨论】:

    【解决方案2】:

    我没有得到你的问题。 如果您需要向 Web 控件添加一些额外的行为,您应该执行与您想要扩展继承的类行为相同的操作。 您可以直接继承 TextBox 类并添加您需要的所有额外行为

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

    【讨论】:

    • 但这怎么能连接到实际的文本框,当用户更改文本并提交时,ViewState["Text"] 会更新?
    • 这样还是不行,因为在用户输入文本然后提交的过程中,没有访问到Text属性的集合,因此ViewStart条目为空。跨度>
    【解决方案3】:

    这可能与页面生命周期有关。尝试在 Text 属性 getter 中使用 this.EnsureChildControls()。有关页面生命周期的更多信息,请访问MSDN documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2014-10-11
      • 2011-07-31
      相关资源
      最近更新 更多