возникла некоторая проблема...
есть сайт, на ондной машине из дебага он работает нормально, но вот когда кладу его на сервер периодически вылетает вот такая вот ошибочка
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>попутный вопрос: динамические контролы при постбаке не сохраняются что ли? их какждый раз надо подгружать?
Здравствуйте, Аноним, Вы писали:
А>Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.
интересно... попробую.... сейчас сделано в page_load
Здравствуйте, Аноним, Вы писали:
А>Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.
да кстати, а в кокой момент происходит восстановление состояния?
Здравствуйте, lumf, Вы писали:
L>интересно... попробую.... сейчас сделано в page_load
Page_Load вполне сгодится. Проблема скорее всего в том, что меняется ID динамически создаваемого контрола. Чтобы этого избежать, нужно задавать ID контрола явно.
Состояние котролов гарантировано востановлено в page_load поэтому до этого они уже должны быть добавлены в коллекцию. В PageInit состояние еще не востановлено. Точный момент когда происходит востановление не знаю.
Здравствуйте, lumf, Вы писали:
L>Здравствуйте, Аноним, Вы писали:
А>>Если вы хотите добавлять конролы в коллекцию динамически, то это необходисо делать каждый раз при постбэке и до воставноления состояни. Например в PageInit.
L>интересно... попробую.... сейчас сделано в page_load
Здравствуйте, Yury_M, Вы писали:
Y_M>Состояние котролов гарантировано востановлено в page_load поэтому до этого они уже должны быть добавлены в коллекцию. В PageInit состояние еще не востановлено. Точный момент когда происходит востановление не знаю.
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 засунуть
Не слушайте рекомендаций программиста. Никогда. Всё равно не поймете.
[Нравится ответ, проголосуй за него]
...
PageInit();
// Load the viewstate and process posted valuesif (IsPostBack) {
LoadPageViewState();
ProcessPostData();
}
// Fire the Page_Load event to the ASPX source code
PageLoad();
...
Зачем же обрывать на самом интересном месте? Привожу псевдокод целиком:
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 valuesif (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));
}
Здравствуйте, algol, Вы писали:
Y_M>>Состояние котролов гарантировано востановлено в page_load поэтому до этого они уже должны быть добавлены в коллекцию. В PageInit состояние еще не востановлено. Точный момент когда происходит востановление не знаю.
A>Курим раздел Adding Controls to a Web Forms Page Programmatically
Кроме этого, восстановление ViewState происходит и при вызове Controls.Add, т.е. при добавлении самого контрола.
У нас "два" по всем наукам, но ботанику мы знаем на "пять"!
Здравствуйте, Gollum, Вы писали:
G>Кроме этого, восстановление ViewState происходит и при вызове Controls.Add, т.е. при добавлении самого контрола.
Вообще-то в обеих приведенных ссылках утверждается, что восстановление ViewState происходит в два этапа. Первый перед Page_Load для восстановления состояния статических контролов, второй — после Page_Load восстанавливает состояние динамически созданных контролов.
Здравствуйте, algol, Вы писали:
A>Вообще-то в обеих приведенных ссылках утверждается, что восстановление ViewState происходит в два этапа. Первый перед Page_Load для восстановления состояния статических контролов, второй — после Page_Load восстанавливает состояние динамически созданных контролов.
Здесь приводилась уже декомпиляция Controls.Add(). Там происходит в числе прочего и загрузка ViewState
Ihesu who hath wonders sore, grants us the blyss of heathen
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.