postback и динамические контролы
От: lumf  
Дата: 17.03.06 08:57
Оценка:
возникла некоторая проблема...
есть сайт, на ондной машине из дебага он работает нормально, но вот когда кладу его на сервер периодически вылетает вот такая вот ошибочка

Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.


если обернуть место где подгружаются контролы, то как раз самый главный контрол и не подгружается....

что посоветуете предпринять?

попутный вопрос: динамические контролы при постбаке не сохраняются что ли? их какждый раз надо подгружать?
Сиськи и процессоры
Re: postback и динамические контролы
От: Аноним  
Дата: 17.03.06 09:32
Оценка:
Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.

Здравствуйте, lumf, Вы писали:

L>возникла некоторая проблема...

L>есть сайт, на ондной машине из дебага он работает нормально, но вот когда кладу его на сервер периодически вылетает вот такая вот ошибочка

L>Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.



L>если обернуть место где подгружаются контролы, то как раз самый главный контрол и не подгружается....


L>что посоветуете предпринять?


L>попутный вопрос: динамические контролы при постбаке не сохраняются что ли? их какждый раз надо подгружать?
Re[2]: postback и динамические контролы
От: lumf  
Дата: 17.03.06 09:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.



интересно... попробую.... сейчас сделано в page_load
Сиськи и процессоры
Re[2]: postback и динамические контролы
От: lumf  
Дата: 17.03.06 10:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.


да кстати, а в кокой момент происходит восстановление состояния?
Сиськи и процессоры
Re[3]: postback и динамические контролы
От: algol Россия about:blank
Дата: 17.03.06 10:31
Оценка:
Здравствуйте, lumf, Вы писали:

L>интересно... попробую.... сейчас сделано в page_load


Page_Load вполне сгодится. Проблема скорее всего в том, что меняется ID динамически создаваемого контрола. Чтобы этого избежать, нужно задавать ID контрола явно.
Re[3]: postback и динамические контролы
От: Yury_M  
Дата: 17.03.06 10:40
Оценка:
Состояние котролов гарантировано востановлено в page_load поэтому до этого они уже должны быть добавлены в коллекцию. В PageInit состояние еще не востановлено. Точный момент когда происходит востановление не знаю.

Здравствуйте, lumf, Вы писали:

L>Здравствуйте, Аноним, Вы писали:


А>>Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.



L>интересно... попробую.... сейчас сделано в page_load
Re[4]: postback и динамические контролы
От: algol Россия about:blank
Дата: 17.03.06 11:17
Оценка:
Здравствуйте, Yury_M, Вы писали:

Y_M>Состояние котролов гарантировано востановлено в page_load поэтому до этого они уже должны быть добавлены в коллекцию. В PageInit состояние еще не востановлено. Точный момент когда происходит востановление не знаю.


Курим раздел Adding Controls to a Web Forms Page Programmatically

Dynamic Controls and View State

When a control is created dynamically at run time, some information about the control is stored in the view state that is rendered with the page. When the page is posted back to the server, however, non-dynamic controls (those defined on the page) are instantiated in the Page.Init event and view state information is loaded before the dynamic controls can be recreated (generally in the Page_Load handler). Effectively, before the dynamic controls are recreated, view state is temporarily out of sync with the page's controls. After the Page_Load event has run, but before control event handling methods are called, the remaining view state information is loaded into the dynamically created controls.

In most scenarios, this view state processing model works fine. Typically, you add dynamic controls to the end of a container's collection of controls. The view state information stored for the dynamic controls is therefore extra information at the end of the view state structure for the appropriate container, and the page can ignore it until after the controls are created.

postback и динамические контролы
От: Аноним  
Дата: 17.03.06 09:23
Оценка:
У тебя отваливается контрол, и система не находит куды VIEWSTATE засунуть
Не слушайте рекомендаций программиста. Никогда. Всё равно не поймете.
[Нравится ответ, проголосуй за него]



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: postback и динамические контролы
От: Serpenter  
Дата: 18.03.06 12:39
Оценка:
Здравствуйте, lumf, Вы писали:

L>Здравствуйте, Аноним, Вы писали:


А>>Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.


L>да кстати, а в кокой момент происходит восстановление состояния?

http://msdn.microsoft.com/library/en-us/dnaspp/html/dngrfTheASPNETHTTPRuntime.asp
http://msdn.microsoft.com/library/en-us/dnvs05/html/Internals.asp

...
PageInit();

// Load the viewstate and process posted values
if (IsPostBack) {
   LoadPageViewState();
      ProcessPostData();
}   

// Fire the Page_Load event to the ASPX source code
PageLoad();
...
Re[4]: postback и динамические контролы
От: algol Россия about:blank
Дата: 18.03.06 13:00
Оценка:
Здравствуйте, Serpenter, Вы писали:

Зачем же обрывать на самом интересном месте? Привожу псевдокод целиком:

private void ProcessRequest() 
{
   // Determine whether the request comes as a postback
IsPostBack = DeterminePostBackMode();

// Fire the Page_Init event to the ASPX source code
PageInit();

// Load the viewstate and process posted values
if (IsPostBack) {
   LoadPageViewState();
      ProcessPostData();
}   

// Fire the Page_Load event to the ASPX source code
PageLoad();

// 1) Process posted values for the second time (in case of 
//    dynamically created controls) 
// 2) Raise property-changed server-side events to input-driven 
//    controls (i.e., the checkbox state changed)
// 3) Execute any code associated with the postback event 
if (IsPostBack) {
      ProcessPostDataSecondTry();
   RaiseChangedEvents();
      RaisePostBackEvent();
}   

// Fire the Page_PreRender event to the ASPX source code
PreRender();

// Save the current state of the controls to the viewstate
SavePageViewState();

// Render the contents of the page to HTML
RenderControl(CreateHtmlTextWriter(Response.Output));
}
Re: postback и динамические контролы
От: lumf  
Дата: 20.03.06 06:28
Оценка:
Здравствуйте, C...R...a...S...H, Вы писали:

CRA>У тебя отваливается контрол, и система не находит куды VIEWSTATE засунуть


тогда такой вопрос: что значит отваливается контрол? то есть в нем происходит какой-нить эксепшен и он отказывается подгружаться?
Сиськи и процессоры
Re[5]: postback и динамические контролы
От: Gollum Россия  
Дата: 20.03.06 16:57
Оценка:
Здравствуйте, algol, Вы писали:

Y_M>>Состояние котролов гарантировано востановлено в page_load поэтому до этого они уже должны быть добавлены в коллекцию. В PageInit состояние еще не востановлено. Точный момент когда происходит востановление не знаю.


A>Курим раздел Adding Controls to a Web Forms Page Programmatically


Кроме этого, восстановление ViewState происходит и при вызове Controls.Add, т.е. при добавлении самого контрола.
У нас "два" по всем наукам, но ботанику мы знаем на "пять"!
Eugene Agafonov on the .NET

Re[6]: postback и динамические контролы
От: algol Россия about:blank
Дата: 20.03.06 17:11
Оценка:
Здравствуйте, Gollum, Вы писали:

G>Кроме этого, восстановление ViewState происходит и при вызове Controls.Add, т.е. при добавлении самого контрола.


Вообще-то в обеих приведенных ссылках утверждается, что восстановление ViewState происходит в два этапа. Первый перед Page_Load для восстановления состояния статических контролов, второй — после Page_Load восстанавливает состояние динамически созданных контролов.
Re[7]: postback и динамические контролы
От: Gollum Россия  
Дата: 20.03.06 17:17
Оценка:
Здравствуйте, algol, Вы писали:

A>Вообще-то в обеих приведенных ссылках утверждается, что восстановление ViewState происходит в два этапа. Первый перед Page_Load для восстановления состояния статических контролов, второй — после Page_Load восстанавливает состояние динамически созданных контролов.


Здесь приводилась уже декомпиляция Controls.Add(). Там происходит в числе прочего и загрузка ViewState
Ihesu who hath wonders sore, grants us the blyss of heathen
Eugene Agafonov on the .NET

Re[8]: postback и динамические контролы
От: algol Россия about:blank
Дата: 20.03.06 17:49
Оценка:
Здравствуйте, Gollum, Вы писали:

G>Здесь приводилась уже декомпиляция Controls.Add(). Там происходит в числе прочего и загрузка ViewState


Да, но там стоит такое условие:
        if (this._controlState >= ControlState.ViewStateLoaded)

Т.е. ViewState просто перечитывается учитывая новое положение контрола в иерархии, но он уже должен быть загружен. Или не так?
Re[9]: postback и динамические контролы
От: Gollum Россия  
Дата: 20.03.06 18:08
Оценка:
A>Т.е. ViewState просто перечитывается учитывая новое положение контрола в иерархии, но он уже должен быть загружен. Или не так?

Да, но он потом перечитывается, при этом загружаясь заново.

if (this._controlState >= ControlState.ChildrenInitialized)
      {
            control.InitRecursive(control1);
            if (this._controlState >= ControlState.ViewStateLoaded)
            {
                  object obj1 = null;
                  if (this._controlsViewState != null)
                  {
                        obj1 = this._controlsViewState[index];
                        this._controlsViewState.Remove(index);
                  }
                  control.LoadViewStateRecursive(obj1);
                  if (this._controlState >= ControlState.Loaded)
                  {
                        control.LoadRecursive();
                        if (this._controlState >= ControlState.PreRendered)
                        {
                              control.PreRenderRecursiveInternal();
                        }
                  }
            }
      }


internal void LoadViewStateRecursive(object savedState)
{
      if ((savedState != null) && !this.flags[4])
      {
            Triplet triplet1 = (Triplet) savedState;
            if ((this.Page != null) && this.Page.IsPostBack)
            {
                  try
                  {
                        this.LoadViewState(triplet1.First);
                  }
                  catch (InvalidCastException)
                  {
                        throw new HttpException(HttpRuntime.FormatResourceString("Controls_Cant_Change_Between_Posts"));
                  }
                  catch (IndexOutOfRangeException)
                  {
                        throw new HttpException(HttpRuntime.FormatResourceString("Controls_Cant_Change_Between_Posts"));
                  }
            }
            if (triplet1.Second != null)
            {
                  ArrayList list1 = (ArrayList) triplet1.Second;
                  ArrayList list2 = (ArrayList) triplet1.Third;
                  ControlCollection collection1 = this.Controls;
                  int num1 = collection1.Count;
                  int num2 = list1.Count;
                  for (int num3 = 0; num3 < num2; num3++)
                  {
                        int num4 = (int) list1[num3];
                        if (num4 < num1)
                        {
                              collection1[num4].LoadViewStateRecursive(list2[num3]);
                        }
                        else
                        {
                              if (this._controlsViewState == null)
                              {
                                    this._controlsViewState = new Hashtable();
                              }
                              this._controlsViewState[num4] = list2[num3];
                        }
                  }
            }
            this._controlState = ControlState.ViewStateLoaded;
      }
}
В лучших книгах всегда нет имен, и в лучших картинах — лиц
Eugene Agafonov on the .NET

Re: postback и динамические контролы
От: yaroslav.ov Россия  
Дата: 24.03.06 17:05
Оценка:
L>Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.

У меня такая ошибка возникала когда один контрол (статический — постоянно объявленный на странице) загружал динамически другие контролы в зависимости от своих свойств.
Чтобы ошибка не возникала надо было "перевести" загрузку view state из режима загрузки по индексу в режим загрузки по ID. Для этого необходимо установить атрибут [ViewStateModeById] в объявлении класса Parent-контрола. И естественно при этом обеспечить уникальность ID для динамически загружаемых контролов. Теперь Parent-контрол для всех child controls view state будет восстанавливать по ID, а не по индексу.

Вот тут можно почитать по этому поводу

Ну или привожу такой вот кусок:

By default, when a parent control loads view state into child controls it creates, it does this by the position of each child control in the parent control's Controls collection. When view state is initially applied, all child controls might not have been created. In this case, the view state for controls not yet created is saved, and applied when the child controls are created later.

For a parent control to apply view state to its child controls, two conditions must be met:

On postback, the parent control must create the child controls in exactly the same order as the previous request so that the order of the controls remains consistent.

After postback, any child controls created must be added to the end of the parent control's Controls collection.

If these two conditions cannot be met, as in the case of the delayed creation of a child control, the parent control can load view state by using ID. To set the LoadViewStateByID property to true, use the ViewStateModeByIdAttribute metadata attribute for the parent control.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.