#asp.net #user-controls #event-handling
#asp.net #пользовательские элементы управления #обработка событий
Вопрос:
Допустим, у меня есть страница с моим пользовательским UserControl
(содержащим только asp:Literal
и некоторое строковое свойство) и кнопкой. Теперь я хочу изменить текст литерала при нажатии кнопки, поэтому я изменяю свойство string моего элемента управления в событии нажатия кнопки. Вот так:
//in aspx
protected void Button1_Click(object sender, EventArgs e)
{
testControl.Text = "triggered";
}
Проблема в том, что мой литерал остается неизменным, потому что Page_Load
событие срабатывает первым и создает мой пользовательский элемент управления, затем Button_Clicked
срабатывает и изменяет свойство, но поскольку элемент управления уже создан, он ничего не делает. Это код моего элемента управления, лежащий в основе:
public partial class TestControl : System.Web.UI.UserControl
{
public string Text { get; set; } }
protected void Page_Load(object sender, EventArgs e)
{
lblTest.Text = Text;
}
}
Я выяснил, что если я перемещу какую-либо логику в пользовательском элементе управления из Page_Load
в установщик свойств, она изменится, как и предполагалось. Вот так:
public string Text { get { return lblTest.Text; } set { lblTest.Text = value; } }
Есть ли какой-либо другой (лучший) способ сделать это? Моя реальная проблема связана с гораздо более сложными элементами управления, чем описано здесь, но проблемы остаются теми же: при любой обратной передаче все свойства, установленные в обработчиках событий, игнорируются.
Ответ №1:
Перемещение всей логики из Page_Load
в Page_PreRender
решило проблему. Теперь свойства устанавливаются перед выполнением логики. Я подожду других ответов, чтобы проверить, есть ли лучшее решение и есть ли какие-либо недостатки в использовании Page_PreRender
.
Ответ №2:
Это видео может помочь: Как мне: Сохранить состояние пользовательского элемента управления во время обратной передачи
Комментарии:
1. Я думаю, это не совсем о моей проблеме. Проблема заключалась в использовании свойств во время обратной передачи, которые их изменяют. Кстати, для сохранения любых данных между обратными отправками я обычно использую что-то вроде:
public string Text { get { return (string)ViewState["Text"];} set { ViewState["Text"] = value; }
. Кажется, это нормально работает для базовых свойств, но я не уверен, что при любых обстоятельствах ;).