2012-03-03 2 views
8

Я немного поработал над динамическими элементами управления и ViewState.Почему ASP.NET динамические элементы управления сохраняют ViewState даже при добавлении в Page_Load?

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

  1. Инициализация.
  2. LoadViewState.
  3. LoadPostbackData.
  4. Нагрузка.
  5. RaisePostbackEvent.
  6. SaveViewState.
  7. Рендеринг.

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

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

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

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

ответ

4

Этот код будет демонстрировать его в действии:

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"; 
    } 
} 

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

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

1

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

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

0

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

Смежные вопросы