Почему динамические элементы управления ASP.NET могут сохранять ViewState даже при добавлении в Page_Load? - PullRequest
8 голосов
/ 03 марта 2012

Я провел небольшое исследование, связанное с динамическими элементами управления и ViewState.

И я прочитал, что для того, чтобы сохранить ViewState для динамического элемента управления, вы должны добавить его в событие Page_Init. Это имеет смысл, потому что PageLifeCycle:

  1. Initialization.
  2. LoadViewState.
  3. LoadPostbackData.
  4. Загрузка.
  5. RaisePostbackEvent.
  6. SaveViewState.
  7. Render.

Но я создал тестовое приложение и увидел, что значения ViewState и свойств сохраняются, даже если я добавляю элемент управления в событие Page_Load, а не после. С этого момента я нашел только противоречивую информацию. Некоторые говорят, что элементы управления могут догнать PageLifeCycle, другие говорят, что вы должны добавить их в Page_Init. Может кто-нибудь уточнить это для меня?

Также в MSDN я нашел:

Примечание. Возможно, вам удастся загрузить ваши элементы управления в Обработчик события Page_Load и поддержание состояния просмотра должным образом. Это все зависит от того, устанавливаете ли вы какие-либо свойства динамически загружаемые элементы управления программно и, если да, когда вы делать это относительно строки Controls.Add (dynamicControl). Тщательный обсуждение этого вопроса выходит за рамки данной статьи, но причина, по которой это может работать, заключается в том, что метод Add () свойства Controls рекурсивно загружает состояние просмотра родителя в его потомки, даже хотя этап состояния просмотра нагрузки пройден.

Но я не совсем понимаю это полностью, поэтому надеюсь, что кто-нибудь сможет это объяснить. Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

Этот код продемонстрирует это в действии:

protected void Page_Load(object sender, EventArgs e)
{
    Button b1 = new Button();
    Button b2 = new Button();
    if (!IsPostBack)
    {
        b1.Text = "Button1";
    }
    this.form1.Controls.Add(b1);
    this.form1.Controls.Add(b2);
    if (!IsPostBack)
    {
        b2.Text = "Button2";
    }
}

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

EDIT
Я забыл упомянуть - по сути, это связано с тем, что элемент управления воспроизводит жизненный цикл страницы, чтобы «догнать» страницу, когда она добавляется в дерево элементов управления через Controls.Add () - Есть бесконечные статьи по этому вопросу, потому что не так много об этом просто.

1 голос
/ 04 марта 2012

В прошлом (ASP.NET 2.0 или 3.5, не уверен) при попытке реализовать то же, что вы упоминали, мне приходилось добавлять элементы управления в Page_Init. Добавляя их в Page_Load, я не вижу, чтобы изменения, внесенные на стороне клиента, доходили до серверной части, что вполне логично, потому что когда среда пыталась привязать состояние представления к элементам управления, они еще не были созданы.

Я очень удивлен, узнав, что это изменилось. Может быть, что-то введено в ASP.NET 4.0?

0 голосов
/ 03 марта 2016

В NET 4.5 просто переопределите метод CreateChildControls () и поместите его в здание динамических элементов управления.

...