Viewstate, я правильно понял? - PullRequest
       4

Viewstate, я правильно понял?

0 голосов
/ 11 октября 2010

Скажем, у меня есть 5 кнопок на странице, пронумерованных 1-5.

При щелчке по одному значению средство получения / установки видового состояния присваивает это значение нажатой кнопке.

Если я проверяю значение в Page_Init () / OnInit (), после обратной передачи значение всегда будет пустым / пустым.

Это правильно?

Если это так, могу ли я сделать что-то еще, что не требует архитектурных изменений? Или что-то похожее, что я могу использовать для сохранения изменений в постах (Session [], к сожалению, не очень хорошо).

Ответы [ 4 ]

3 голосов
/ 11 октября 2010

ViewState сохраняет состояние страницы (параметры страницы и элемента управления + пользовательские значения, сохраненные в ViewState) между постами обратно. Это просто скрытое поле с сериализованными (и зашифрованными) данными о состоянии. Когда вы устанавливаете что-то в ViewState в коде позади, оно передается с разметкой страницы клиенту и отправляется обратно на сервер в следующей обратной передаче. Страница жизненный цикл (между InitComplete и PreLoad) десериализует состояние из ViewState. Вот почему вы не можете получить доступ к данным из ViewState в OnInit.

1 голос
/ 11 октября 2010

Я не на 100% уверен, что вы спрашиваете здесь, но это звучит как проблема с ASP.NET Page Lifecycle .Это сбивает всех с толку!

По сути, происходит то, что разработчик ожидает, что он сможет выполнить какую-то работу в Page_Init (или, как правило, Page_Load), но событие click для всего, что вызвало постбэк, имеющий 'это еще не произошло .

На самом деле, iirc ViewState даже не был десериализован при запуске Page_Init.

Я не могу сказать вам, где находится правильное место для выполнения любой работы, которую необходимо выполнить.не зная больше, но вы, вероятно, захотите переместить часть этого кода, находящегося в Page_Init, в обработчик событий позже в жизненном цикле.

Вы можете убедиться в этом сами: вставьте точку останова в начале Page_Init иеще один в начале MyButton_Click, вы увидите, что Page_Init срабатывает первым.

1 голос
/ 11 октября 2010

см .: http://code.google.com/p/citiport2/wiki/All_Events

Page: AddParsedSubObject
Page: CreateControlCollection
Page: AddedControl
Page: AddParsedSubObject
Page: AddedControl
Page: ResolveAdapter
Page: DeterminePostBackMode
Page: PreInit
Control: ResolveAdapter
Control: Init
Control: TrackViewState
Page: Init
Page: TrackViewState
Page: InitComplete
Page: LoadPageStateFromPersistenceMedium
Control: LoadViewState
Page: EnsureChildControls
Page: CreateChildControls
Page: PreLoad
Page: Load
Control: DataBind
Control: Load
Page: EnsureChildControls
Page: LoadComplete
Page: EnsureChildControls
Page: PreRender
Control: EnsureChildControls
Control: PreRender
Page: PreRenderComplete
Page: SaveViewState
Control: SaveViewState
Page: SaveViewState
Control: SaveViewState
Page: SavePageStateToPersistenceMedium
Page: SaveStateComplete
Page: CreateHtmlTextWriter
Page: RenderControl
Page: Render
Page: RenderChildren
Control: RenderControl
Page: VerifyRenderingInServerForm
Page: CreateHtmlTextWriter
Control: Unload
Control: Dispose
Page: Unload
Page: Dispose

Страница: Инициализация более ранняя

0 голосов
/ 12 октября 2010

Вы можете использовать Request.Form ["idofbutton"], чтобы получить объявленное значение. Это происходит как часть протокола http. Изучите http запрос / ответ в чем-то вроде firebug, чтобы увидеть, что публикуется.

...