Возвращаемся назад TextBox.Text в Page_Load? - PullRequest
1 голос
/ 23 марта 2011

У меня есть asp: TextBox и кнопка отправки на моей странице asp.net.После нажатия кнопки значение TextBos отправляется обратно.Я собираюсь оставить текстовое значение в обратной сессии в сеансе, чтобы другие дочерние элементы управления могли получить доступ к значению во время их Page_Load.Тем не менее, я всегда получаю НИЧЕГО ("") в методе Page_Load, и я могу прочитать текст в обработчике нажатия кнопки.Я знаю, что «событие нажатия кнопки» происходит после Page_Load.Итак, я спрашиваю, как я могу «предварительно извлечь» TextBox.text во время Page_Load?

public partial class form_staffinfo : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e){
        string s = staff_id.Text; //Reach this line first, but GET empty value. However, I want to keep it in the session during this moment.
    }

    protected void btn_submit_Click(object sender, EventArgs e) {
        string s = staff_id.Text; //Reach this line afterward, value got.
    }
}

- EDITED -

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="form_staffinfo.ascx.cs" Inherits="form_staffinfo" %>
<asp:Label ID="Label1" runat="server" Text="Staff ID: "></asp:Label>
<asp:TextBox ID="staff_id" runat="server" ></asp:TextBox>
<asp:Button ID="btn_submit" runat="server" Text="Query" OnClick="btn_submit_Click" />

Так как я не могу получитьтекст TextBox в Page_Load, поэтому я не включил код, связанный с сессией, для четкого представления.

Спасибо!William

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

Ни одно из значений ваших серверных элементов управления не доступно для потребления в Page_Load.Эти элементы управления назначаются после проверки формы (то есть после загрузки формы) и до того, как сработают события элемента управления (например, щелчки кнопок в вашем примере).Отправленные значения находятся в коллекции Request.Form.Посмотрите в свойстве AllKeys, и вы увидите ключ, который оканчивается на $staff_id, если вы используете опубликованный пример.В ключе могут быть другие символы в зависимости от того, вложен ли элемент управления в главную страницу или другой элемент управления.

Если вам абсолютно необходимо иметь это значение при загрузке страницы, выберите его из Request.Formколлекция вместо пользовательского элемента управления, но я бы поставил под сомнение целесообразность получения значения, которое происходит в начале жизненного цикла страницы.Можно предположить захват события OnTextChanged в текстовом поле, если необходимо сохранить значение в сеансе.

РЕДАКТИРОВАТЬ - дополнительное объяснение , если вы собираетесь создать пользовательское событие для пользовательского элемента управления, естьтолько пара шагов к нему.

Создание делегата.Это будет общий объект для обмена сообщениями между контролями.

public delegate void StaffIdChangedEvent(object sender, string staffId);

Объявите событие с использованием этого делегата в пользовательском элементе управления, который будет транслироваться.

public event StaffIdChangedEvent StaffIdChanged;

В вашем пользователеконтроль, когда вы готовы к трансляции (скажем, из события OnTextChanged текстового поля Staff_id), вы просто вызываете событие [Как правило, рекомендуется проверить, является ли событие пустым]

this.StaffIdChangedEvent(this, "staff-id-value-here");

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

this.form_staffinfo.StaffIdChangedEvent += this.some_method_on_page;

Просто убедитесь, что метод на странице имеет ту же сигнатуру метода, что и делегат, используемый для объявления события.

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

this.form_staffinfo.StaffIdChangedEvent += this.some_method_on_page;
this.form_staffinfo.StaffIdChangedEvent += this.some_control_on_the_page;
this.form_staffinfo.StaffIdChangedEvent += this.some_other_control_on_the_page;

В любом случае, я обычно предпочитал делать этот тип проводки на страницеМетод OnInit.

override protected void OnInit(EventArgs e)
    {
        base.OnInit(e);
        InitializeComponent();
    }

и просто напишите свой собственный метод InitializeComponent, чтобы централизовать любую проводку, которую вам нужно сделать.

1 голос
/ 23 марта 2011

Есть еще кое-что, что устанавливает значение в текстовом поле.Не могли бы вы проверить, переопределяете ли вы другое событие, которое происходит до Page_Load, и изменяете текстовое свойство textbox.Даже, размещение кода, где вы обновляете переменную сеанса, было бы удобно.Из кода, который вы разместили, он должен работать.

0 голосов
/ 23 марта 2011

У вас отключен autoeventwireup?Я могу ошибаться, но я думаю, что если он отключен, ваша Page_Load не сработает.Если вы хотите оставить его отключенным, вы всегда можете переопределить событие OnLoad ...

protected override void OnLoad(EventArgs e)
{
  base.OnLoad(e);
  // do stuff
}
...