Как изменить свойство UserControl при обратной передаче?

#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; } . Кажется, это нормально работает для базовых свойств, но я не уверен, что при любых обстоятельствах ;).