#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 пользовательского элемента управления запускается ДО нажатия кода на кнопке главной страницы, поэтому переменная еще недоступна. Последовательность после нажатия кнопки выглядит следующим образом:
- Выполняется загрузка страницы пользовательского элемента управления
- Код в событии кнопки на главной странице
- Выполняется другой код (вне 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. Муфаса — это связано с тем, что я добавил в правке, и действительно работает — большое спасибо.