ASP.Net: пользовательские элементы управления, добавленные в заполнитель, динамически не могут получить значения - PullRequest
8 голосов
/ 19 сентября 2008

Я добавляю некоторые пользовательские элементы управления динамически в серверный элемент управления PlaceHolder. Мой пользовательский элемент управления состоит из нескольких меток и некоторых текстовых элементов управления.

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

После завершения обратной передачи в текстовых полях будут введены данные, которые я ввел до обратной передачи. Это говорит мне, что текст в полях сохраняется через ViewState. Я просто не знаю, почему я не могу найти их во время отладки.

Может кто-нибудь сказать мне, почему я не буду видеть данные, введенные пользователем на сервере?

Спасибо за любую помощь.

Ответы [ 8 ]

9 голосов
/ 19 сентября 2008

Это основано на последовательности событий .NET v1, но оно должно дать вам идею:

  • Initialize (событие Init)
  • Начать отслеживание состояния просмотра (проверяет, есть ли обратная передача)
    • Загрузить состояние просмотра (при обратной передаче)
    • Загрузка данных обратной передачи (при обратной передаче)
  • Load (событие загрузки)
    • Поднять измененные события (при обратной передаче)
    • Поднять события обратной передачи (при обратной передаче)
  • PreRender (событие PreRender)
  • Сохранить состояние просмотра
  • Рендер
  • Unload (событие разгрузки)
  • Утилизировать

Как вы можете видеть, загрузка данных ViewState обратно в элементы управления происходит до события Load. Поэтому для того, чтобы ваши динамически добавленные элементы управления «сохранили» эти значения, они должны быть представлять для страницы ASP.NET, чтобы сначала загрузить значения. Вам потребуется заново создать эти элементы управления на этапе инициализации, прежде чем произойдет загрузка состояния просмотра.

3 голосов
/ 16 июля 2009

Вчера я понял, что вы можете заставить ваше приложение работать как обычно, загрузив дерево элементов управления сразу после запуска loadviewstateevent. если вы переопределите событие loadviewstate, вызовите mybase.loadviewstate и затем поместите свой собственный код для регенерации элементов управления сразу после него, значения для этих элементов управления будут доступны при загрузке страницы. В одном из моих приложений я использую поле viewstate для хранения идентификатора или информации о массиве, которую можно использовать для воссоздания этих элементов управления.

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub
2 голосов
/ 19 сентября 2008

Я полагаю, что вам нужно будет добавить UserControl в PlaceHolder во время фазы инициализации жизненного цикла страницы, чтобы ViewState заполнялся фазой загрузки для чтения этих значений. Это тот порядок, в котором вы их загружаете?

1 голос
/ 19 сентября 2008

Убедитесь, что вы определяете динамические элементы управления на уровне класса и добавляете их в контейнер ASP:

Private dynControl As ASP.MyNamespace_MyControl_ascx

И когда вы создаете экземпляр элемента управления, убедитесь, что вы вызываете LoadControl, чтобы объект был добавлен правильно:

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
0 голосов
/ 05 мая 2009

Я также хочу добавить, что я видел, что пользовательские элементы управления работают так, как вы ожидаете, просто установив свойство Control.ID во время выполнения. Если вы не установите идентификатор, элементы могут быть построены в другом порядке и работать странно.

0 голосов
/ 19 сентября 2008

Мы испытали то же самое и обработали это, используя ghost-элементы управления на page_load, которые имеют точно такой же .ID, а затем пост-ответ собирает события и данные. Как говорили другие, это динамическое добавление элемента управления после этапов инициализации, когда состояние уже построено, а элементы, добавленные после, не сохраняются.

Надеюсь, это немного поможет.

0 голосов
/ 19 сентября 2008

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

Вот полезная ссылка на жизненном цикле страницы, чтобы помочь вам:

http://msdn.microsoft.com/en-us/library/ms178472.aspx

0 голосов
/ 19 сентября 2008

Вы должны создать свои элементы управления в обработчике события Page_PreInit. Модель управления сервером ASP.NET хитрая; вы должны полностью понимать жизненный цикл страницы , чтобы сделать это правильно.

...