Параметры динамического контента в ASP.Net - PullRequest
1 голос
/ 24 сентября 2008

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

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

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

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


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

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

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

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


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

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

Ответы [ 4 ]

2 голосов
/ 24 сентября 2008

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

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

  1. Initialize
    • LoadViewState
    • Загрузка данных обратной передачи
    • Управление вызовами Загрузка событий
    • Событие загрузки вызова
    • События управления вызовами
    • Control PreRender
    • PreRender
    • SaveViewState
    • Выгрузка

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

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


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

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

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

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

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

Некоторые другие опции:

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...