Пользовательский WebControl и Postback

Я пытаюсь создать несколько настраиваемых веб-элементов управления, обертывающих некоторые существующие элементы управления. Один из них, например, обертка для текстового поля (потому что мне нужны дополнительные поведения, такие как соответствующие валидаторы). Проблема в том, что я не уверен, как получить данные этого элемента управления для отправки в обратной передаче.

Очень упрощенный пример:

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

Вроде работает, но кажется хакерским. Это кажется разумным способом?


person Kuzco    schedule 28.02.2011    source источник
comment
это возможность унаследовать от System.Web.UI.Textbox? если это так, то вам не нужно заботиться о свойстве Text, вы сосредоточитесь на той функциональности, которую хотите добавить.   -  person adt    schedule 02.03.2011
comment
В данном случае это вариант, и я мог бы это сделать. С другой стороны, есть также немного более сложные элементы управления с аналогичной проблемой, где это более проблематично, и, возможно, было бы лучше придерживаться способа, который я добавил в редактирование.   -  person Kuzco    schedule 02.03.2011


Ответы (3)


Вы должны дать динамически сгенерированному TextBoxу идентификатор, затем в свойстве 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);
}
}
person Ako    schedule 28.02.2011

Я не получил ваш вопрос. Если вам нужно добавить дополнительное поведение к веб-элементу управления, вы должны сделать то же самое, что и в случае, если вы хотите расширить поведение класса, которое является наследованием. вы можете наследовать прямо от класса TextBox и добавить все необходимое дополнительное поведение

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

}
person Massimiliano Peluso    schedule 28.02.2011
comment
Но как это можно связать с фактическим текстовым полем, чтобы, когда пользователь изменяет текст и отправляет, ViewState [Text] обновляется? - person Kuzco; 28.02.2011
comment
Это по-прежнему не помогает, потому что в процессе ввода пользователем текста и последующей отправки набор свойства Text не используется, и поэтому запись ViewStart имеет значение null. - person Kuzco; 02.03.2011

Это могло иметь какое-то отношение к жизненному циклу страницы. Попробуйте использовать this.EnsureChildControls() в получателе свойства Text. Подробнее о жизненном цикле страницы можно найти в документации MSDN.

person Fredrik Holm    schedule 24.02.2014