2008-09-24 15 views
1

Quels sont les choix possibles pour créer du contenu dynamique dynamique dans un site Web ASP.Net?Options pour le contenu dynamique dans ASP.Net

Voici mon scénario. J'ai un site qui a plusieurs régions de contenu imbriquées. Le niveau supérieur correspond aux actions liées à une zone fonctionnelle Catalog, Subscriptions, Settings.

Lorsque vous cliquez sur l'action fonctionnelle, je souhaite ajouter dynamiquement du contenu spécifique à cette action. Par exemple, lorsque vous cliquez sur Catalogue, je souhaite afficher un arbre contenant les fichiers de catalogue & et une région à droite pour plus de détails.

Lorsqu'un utilisateur clique sur l'arborescence, je souhaite qu'un détail sensible au contexte soit chargé dans la zone de détails (comme les propriétés ou les options de gestion des fichiers). J'ai commencé avec UserControls. Ils fonctionnaient bien tant que je continuais à tout charger dans la page, et ne jamais laisser un disparaître. Dès que l'un a disparu, ViewState pour la page a explosé parce que l'arbre d'état d'affichage était invalide.

(je ne voulais pas garder des choses de chargement dans ma page parce que je ne veux pas que les réponses sont trop énormes)

Alors, ma prochaine approche était de remplacer mes régions dynamiques avec IFrames. Ensuite, au lieu d'instancier un UserControl, je voudrais juste changer la source sur mon IFrame. Puisque le contenu du IFrames était des pages indépendantes, je n'ai rencontré aucun problème ViewState. Mais, je suis préoccupé par le fait que IFrames pourrait être un mauvais choix de conception, mais je ne comprends pas parfaitement pourquoi. Le site n'est pas public, donc les moteurs de recherche ne sont pas une préoccupation.


Donc, enfin à ma question.

Quelles sont mes options pour ce scénario? Si je choisis une solution Ajax (jQuery), devrais-je maintenir mon propre ViewState? Y a-t-il d'autres considérations dont je devrais tenir compte?

Répondre

1

Quelques autres options:

  1. contenu uniquement semble d'être dynamique. Vous chargez assez de contrôles sur la page pour gérer quoi que ce soit et seulement montre ce dont vous avez besoin. Cela permet d'économiser beaucoup de tracas avec l'état d'affichage et autres, mais signifie que votre page a une empreinte plus grande.
  2. Ajouter dynamiquement des contrôles à la page. Vous avez déjà joué avec cela, alors vous avez vu certains des problèmes ici. Rappelez-vous simplement que l'endroit où créer vos contrôles dynamiques pour les publications est dans l'événement Page_Init(), et que si vous voulez qu'ils soient dynamiques, vous devez conserver cet état quelque part. Je recommande une base de données.
1

vous avez un certain nombre d'options différentes, et oui, IFrames étaient un mauvais choix de conception.

La première option est la solution AJAX. Et avec cela il n'y a pas vraiment de scénario viewstate, c'est juste que vous transmettez des données avec le serveur web, en construisant l'interface utilisateur à la volée si nécessaire. L'option suivante consiste à ajouter dynamiquement les contrôles dont vous avez besoin pour un message donné, à chaque fois. La façon dont cela fonctionnerait, est qu'au début du cycle de vie de la page, vous devez reconstruire la page exactement comme elle a été envoyée la dernière fois, puis vider tous les contrôles inutiles, et construire seulement ceux qui veulent .

Une troisième option consisterait à utiliser des pages maîtres. Votre contenu de premier niveau pourrait être sur la page principale elle-même, et avoir des liens vers diverses pages du site Web.

Je suis sûr que donné assez de temps, je pourrais trouver plus, mais ces 3 sont apparus juste à la lecture de votre problème.

+0

Toute réponse que j'ai donnée ici serait une façon différente de le dire. Bonne réponse. – KevDog

2

Les contrôles ajoutés dynamiquement ne persistent pas dans viewstate, et c'est la raison pour laquelle cela n'a pas d'importance si vous utilisez AJAX ou iframes ou autre.

Un moyen de contourner le problème consiste à remplir de nouveau les contrôles lors de la publication. Le problème avec cela, est le cycle de vie de page (simplifié) est:

  1. Initialiser
    • LoadViewState
    • charge Postback données
    • contrôle des appels des événements de charge
    • Appel événement Load
    • Événements de contrôle d'appel
    • Contrôle PreRender
    • PreRender
    • SaveViewState
    • Décharger

Ce que cela signifie est le seul endroit pour ajouter à nouveau vos contrôles dynamiques est Initialiser - par ailleurs affiché des données (ou informations) viewstate ne sont pas chargés dans ce contrôle. Mais souvent, étant donné que les données Viewstat/postback ne sont pas encore disponibles dans Initialize, votre code ne dispose pas des informations dont il a besoin pour déterminer quels contrôles doivent être ajoutés.

Le seul autre contournement que j'ai trouvé dans cette situation est d'utiliser un contrôle tiers appelé DynamicControlsPlaceholder. Cela fonctionne assez bien, et conserve les informations de contrôle dans viewstate.


Dans votre cas particulier, il ne semble pas y avoir autant de choix/cas. Est-ce pratique d'avoir tous les différents ensembles de contrôles dans la page, et de les placer dans des contrôles asp: placeholder, puis d'en mettre un à visible, en fonction de ce qui est sélectionné?

+0

Mon exemple était trop simplifié. Il n'est pas possible d'avoir tous les contrôles en mémoire, ce serait trop grand (> 150 options). J'ai les contrôles en utilisant viewsate (créer dans init, ajouter au formulaire en charge), le problème vient quand j'essaie d'en supprimer un après une publication. –

1

contrôles dynamiques et ne viewstate mélangent pas bien, comme indiqué plus haut - mais c'est une bonne chose, parce que même s'ils ont fait la viewstate pour une page dynamique complexe obtiendrait si pléthorique que le rendement diminuerait à néant

utilisez Ajax [J'aime AJAX PRO parce que c'est très simple à utiliser] et gérez vous-même l'état de la page [en session, tables de base de données, ou tout ce qui fonctionne pour votre scénario]. Ce sera un peu plus compliqué à faire, mais les résultats seront efficaces et réactifs: chaque page ne peut mettre à jour que ce qui doit changer, et vous ne souffrirez pas d'une chaîne d'état géante en tout temps