АСП.Нет:Пользовательские элементы управления, динамически добавленные в заполнитель, не могут получить значения.

StackOverflow https://stackoverflow.com/questions/102483

  •  01-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

  • Инициализация (событие инициализации)
  • Начать отслеживание состояния просмотра (проверяет наличие обратной передачи)
    • Загрузить состояние просмотра (если обратная передача)
    • Загрузить данные обратной передачи (если обратная передача)
  • Загрузка (событие загрузки)
    • Вызвать измененные события (если обратная передача)
    • Поднять события обратной передачи (если обратная передача)
  • PreRender (событие PreRender)
  • Сохранить состояние просмотра
  • Оказывать
  • Выгрузить (событие выгрузки)
  • Утилизировать

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

Другие советы

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

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

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

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

Private dynControl As ASP.MyNamespace_MyControl_ascx

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

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)

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

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

Вот хорошая ссылка на жизненный цикл страницы, которая поможет вам:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top