Вопрос

Какие варианты у меня есть для создания динамического контента с отслеживанием состояния на веб-сайте ASP.Net?

Вот мой сценарий.У меня есть сайт, который имеет несколько вложенных областей контента.Верхний уровень - это действия, привязанные к функциональной области Catalog, Subscriptions, Settings.

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

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


Я начал с UserControls.Они работали нормально до тех пор, пока я продолжал загружать все на страницу и никогда не позволял ни одному из них исчезнуть.Как только один из них исчез, ViewState ибо страница взорвалась из-за того, что дерево состояний просмотра было недопустимым.

(Я не хотел продолжать загружать материал на свою страницу, потому что не хочу, чтобы ответы были слишком большими)

Итак, мой следующий подход состоял в том, чтобы заменить мои динамические области на IFrames.Затем вместо создания экземпляра UserControl, я бы просто сменил источник на своем IFrame.Поскольку содержание IFrames это были независимые страницы, с которыми я не сталкивался ни на одной ViewState проблемы.

Но я обеспокоен тем, что IFrames возможно, это неудачный выбор дизайна, но я не совсем понимаю почему.Сайт не является общедоступным, поэтому поисковые системы не вызывают беспокойства.


Итак, наконец, к моему вопросу.

Каковы мои варианты для этого сценария?Если я выберу Ajax-решение (jQuery), нужно ли мне будет поддерживать свое собственное ViewState?Есть ли какие-либо другие соображения, которые я должен принять во внимание?

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

Решение

Некоторые другие варианты:

  1. Только контент появляется быть динамичным.Вы загружаете на страницу достаточное количество элементов управления, чтобы обрабатывать все, что угодно, и только на самом деле показать то, что тебе нужно.Это избавляет от множества хлопот, связанных с состоянием просмотра и тому подобным, но означает, что ваша страница занимает больше места.
  2. Добавляйте элементы управления на страницу динамически.Вы уже играли с этим, так что видели некоторые из приведенных здесь проблем.Просто помните, что место для создания ваших динамических элементов управления для обратной передачи находится в событии Page_Init(), и что если вы хотите, чтобы они были с отслеживанием состояния, вам нужно где-то сохранить это состояние.Я рекомендую базу данных.

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

Элементы управления, которые добавляются динамически, не сохраняются в viewstate, и именно по этой причине не имеет значения, используете ли вы AJAX, iframes или что-то еще.

Одним из возможных решений является повторное заполнение элементов управления при обратной передаче.Проблема с этим заключается в том, что жизненный цикл страницы (упрощенный) является:

  1. Инициализировать
    • LoadViewState Загрузочное состояние
    • Загрузка данных обратной передачи
    • События загрузки управления вызовами
    • Событие загрузки вызова
    • События управления вызовами
    • Предварительный просмотр управления
    • Предварительный просмотр
    • Состояние сохранения
    • Выгружать

Это означает, что единственным местом для повторного добавления ваших динамических элементов управления является Initialize - в противном случае опубликованные данные (или информация о состоянии просмотра) не загружаются в этот элемент управления.Но часто, поскольку данные Viewstat / postback еще недоступны в Initialize, в вашем коде нет информации, необходимой для определения того, какие элементы управления необходимо добавить.

Единственный другой обходной путь, который я нашел в этой ситуации, - это использовать сторонний элемент управления, называемый DynamicControlsPlaceHolder Динамический контролзаполнитель.Это работает довольно хорошо и сохраняет управляющую информацию в viewstate.


В вашем конкретном случае, похоже, не так уж много вариантов / кейсов.Практично ли просто иметь все разные наборы элементов управления на странице и помещать их внутрь элементов управления asp: placeholder, а затем просто установить для одного значение visible, в зависимости от того, что выбрано?

у вас есть несколько различных вариантов, и да, IFrames были неудачным выбором дизайна.

Первый вариант - это решение AJAX.И при этом на самом деле нет сценария viewstate, вы просто передаете данные туда-сюда с веб-сервером, создавая пользовательский интерфейс "на лету" по мере необходимости.

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

Третьим вариантом было бы использование главных страниц.Ваш контент верхнего уровня может размещаться на самой главной странице и содержать ссылки на различные страницы веб-сайта.

Я уверен, что, будь у меня достаточно времени, я мог бы придумать больше, но эти 3 появились только после прочтения вашей проблемы.

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

используйте Ajax [мне нравится AJAX PRO, потому что он очень прост в использовании] и управляйте состоянием страницы самостоятельно [в сеансе, таблицах базы данных или в том, что подходит для вашего сценария].Это будет немного сложнее сделать, но результаты будут эффективными и отзывчивыми:каждая страница может обновлять только то, что необходимо изменить, и вы не будете постоянно перебирать гигантскую строку viewstate взад и вперед

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