Пользовательское событие Page_Load, не считывающее переменную, переданную с главной страницы

#asp.net #user-controls #scope

#asp.net #пользовательские элементы управления #область

Вопрос:

У меня возникла проблема с передачей переменной с главной страницы, содержащей пользовательский элемент управления, на сам пользовательский элемент управления. Хотя переданная переменная обычно доступна в коде пользовательского элемента управления, событие page_load, похоже, не может ее прочитать.

Мой код —

В коде главной страницы-за:

 protected void FindCCFsButton_Click(object sender, EventArgs e)
    {
        if (CustomerDropDown.SelectedIndex != 0)
        { SearchUcCCFList.SetCustID(CustomerDropDown.SelectedValue); }
    }
 

(SearchUcCCFList — это экземпляр пользовательского элемента управления на главной странице aspx).
В коде пользовательского управления, стоящем за:

 public partial class ucCCFList : System.Web.UI.UserControl
{
    public string srchCust { get; set; }

    public void SetCustID(string custID)
    {
        srchCust = custID;
        testCustLabel.Text = GetCustID(); //this works
    }

    public string GetCustID()
    {
        return srchCust;
    }

protected void Page_Load(object sender, EventArgs e)
    {
        CCFGridView.DataSource = DAL.SearchCCFs(custID : GetCustID());  //doesn't work
        CCFGridView.DataBind();
        test2CustLabel.Text = GetCustID();  //doesn't work
    }
 

В событии Page_Load GetCustId() ничего не возвращает (поэтому записи не фильтруются и все возвращаются), хотя его можно прочитать в методах вне Page_Load .

Вероятно, я совершаю ошибку новичка, но буду признателен за любую помощь.

Редактировать — следуя предложению Алана в комментариях, я прошел через последовательность загрузки страницы, и кажется, что событие Page_Load пользовательского элемента управления запускается ДО нажатия кода на кнопке главной страницы, поэтому переменная еще недоступна. Последовательность после нажатия кнопки выглядит следующим образом:

  1. Выполняется загрузка страницы пользовательского элемента управления
  2. Код в событии кнопки на главной странице
  3. Выполняется другой код (вне Page_Load) в пользовательском элементе управления, следовательно, переменная доступна здесь.

Это кажется немного странным, есть ли другой способ передать переменную в пользовательский элемент управления Page_Load?

Комментарии:

1. Откуда вы звоните SearchUcCCFList.SetCustID ? Это должно быть до или в Page_Load страницы

2. Я не думаю, что метод GetCustID помогает.. вы можете извлечь значение свойства из свойства? Похоже, что порядок жизненного цикла события страницы является проблемой. Некоторые точки останова помогут вам понять, что происходит.

3. Tim — SearchUcCCFList.SetCustID находится в событии нажатия кнопки на главной странице (то есть в том, которое включает в себя пользовательский элемент управления (id = SearchUcCCFList)). Я добавил это в свой пост.

4. Алан — первая тестовая метка предназначена только для того, чтобы показать, что значение SetCustID принимается с главной страницы, хотя оно не может быть прочитано в событии Page_Load . Я последовал вашему предложению относительно точек останова и добавил результаты в исходное сообщение.

Ответ №1:

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

Либо переключите пользовательский элемент управления на декларативную привязку, которая будет обрабатывать вызываемые методы в правильном для вас порядке. Или более простое решение в этом случае — изменить привязку данных пользовательского элемента управления с Page_Load на Page_PreRender , которая вызывается позже в жизненном цикле, после вызова обработки щелчка на главной странице.

 protected void Page_PreRender(object sender, EventArgs e)
{
    CCFGridView.DataSource = DAL.SearchCCFs(custID : GetCustID());  // will work now
    CCFGridView.DataBind();
    test2CustLabel.Text = GetCustID();  // will work now
}
 

Для получения более подробного ответа ознакомьтесь с ASP.NET жизненный цикл страницы, включая взаимодействие с жизненным циклом пользовательских элементов управления.

Комментарии:

1. Муфаса — это связано с тем, что я добавил в правке, и действительно работает — большое спасибо.