Пользовательский WebControl и Postback - PullRequest
0 голосов
/ 28 февраля 2011

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

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

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" />

Затем, после ввода текста в текстовые поля и отправки, текст в 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];
    }
}

Кажется, что работает, но чувствует себя немного хакером.Это похоже на разумный способ?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2011

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

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

}
0 голосов
/ 24 февраля 2014

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

0 голосов
/ 28 февраля 2011

Вы должны дать динамически сгенерированному 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);
}
}
...