2009-06-30 6 views
6

J'ai un très gros problème. Je crée un système CRM (Costumer Relationship Management) dans ASP.NET 3.5Je suis coincé dans le piège UpdatePanel

J'ai basé mon projet entier sur les contrôles DevExpress.com et l'utilisation de UpdatePanels.

Maintenant, une de mes pages, qui est une page centrale dans l'ensemble du système, contient un très grand nombre de possibilités et donc une grande quantité de UserControls. Maintenant, mon problème est que ça devient vraiment très lent à cause du fait que les UpdatePanels reposent la page entière et pas seulement le panneau de mise à jour. Nous parlons Sometime 3-4 secondes devant une fenêtre pop-up apparaît :(

Est-il possible que je peux factoriser tout ce système loin de UpdatePanels sans casser mon cou ? Y at-il de toute façon je peux optimiser mon utilisation de UpdatePanels?

le ViewState est absolument géant.

Toutes les bonnes idées sont les bienvenues ...

+0

Je suppose que ce que je demande aussi, est-il un moyen de rendre un UpdatePanel seulement rendre le nouveau et pas la page entière. –

Répondre

8

Il n'y a pas moyen d'obtenir l'affichage dans la page entière à l'aide UpdatePanels. au lieu de redessiner l'application voici deux choses J'essaierais:

  1. Désactiver viewstate pour tous les contrôles qui ne ont pas besoin
  2. Régler le UpdateMode = « conditionnelle » pour vos contrôles utilisateur. Cela ne va pas contourner l'affichage de la page entière, mais cela réduira un peu le temps de rendu. Seul le contenu du UpdatePanel spécifique sera mis à jour dans le navigateur.
  3. Assurez-vous que vos contrôles utilisateur ont des ID courts. La façon dont ASP.NET webforms nomme les contrôles dans le html ces IDs se répète un peu si vous avez beaucoup de contrôles serveur. Il en va de même pour les espaces réservés de la page maître. J'ai une fois coupé une grande page à la moitié de la taille en renommant les contrôles utilisateur et les espaces réservés.
+0

LOL Je ne considérais pas le problème de nommage, bien qu'il soit très certainement là .. oui ils se répètent beaucoup mais je déteste les noms courts pas spécifiques ... maintenant je dois juste considérer si je déteste chargement lent encore plus .. –

+0

Vous pourriez vouloir clarifier ceci: "Seul le contrôle utilisateur spécifique sera mis à jour sur l'écran." Il devrait probablement être "Seulement le UpdatePanel spécifique ...". Vous pouvez également noter que seuls les panneaux nécessaires sont également envoyés au client, par opposition à l'ensemble de la page. –

+0

+1 pour les ID courts. C'est très frustrant en optimisant ma page pour réaliser que la moitié de la requête est faite d'ID d'élément: masterpage_page_form_usercontrol_nestedusercontrol_gridview_label etc etc –

0

Vous devrez remplacer certains des postbacks contenus dans vos panneaux de mise à jour avec de vrais appels AJAX, par exemple envoyer uniquement les données qui sont nécessaires pour l'action au serveur et à revenir seulement ce qui est requis pour mettre à jour la vue, se débarrasser de la publication et les UpdatePanels.

(Vous remarquerez que j'utilise les termes 'action' et 'view' - oui, je suis un fan de MVC.La situation dans laquelle vous vous trouvez est typique du désordre que l'on peut facilement utiliser avec WebForms et l'ASP Commandes .NET AJAX.)

+0

Il est facile d'être un grand fan de l'enfant nouveau sur le bloc :) Je suis sûr qu'il est facile d'écrire du code désordonné dans les deux cadres. – kervin

+0

Oui, c'est certainement possible. Le problème dans WebForms est qu'une page "Hello World" a déjà l'air malpropre! –

0
  • Il me manque quelque chose. Pourquoi votre updatepanel est en train de recharger toute la page. Le but d'un updatepanel est de ne rafraîchir que ce qui est dans ce panneau, n'est-ce pas? Merci pour l'explication. Je suppose que nous parlons de repositionner la page et ne pas redessiner le panneau comme je le pensais.

  • Essayez de désactiver ViewState, en particulier pour les grilles.

  • Quel type de contrôle est le plus courant sur votre page?Essayez de remplacer ceux qui n'utilise pas ViewState ou ControlState
+1

UpdatePanels actualise uniquement le contenu du panneau, mais le cycle de vie complet de la page est exécuté, ce qui signifie que viewstate pour tous les contrôles est envoyé vers/depuis le serveur. –

+0

Merci pour l'explication. Donc, c'est vraiment un problème ViewState. ViewState/ControlState sont des bugs :) Je les désactive autant que possible. – kervin

2

Puisque vous êtes un utilisateur DevExpress, vous pourriez envisager de prendre un peu de temps pour apprendre leur CallbackPanel qui vous permettra avec votre propre UserControl léger ou Control Server à faire asynchrone traitement sans le surcoût du UpdatePanel.

Alternativement (quelqu'un s'il vous plaît me corriger si je me trompe), mais si tous les des postbacks sont asynchrones (dans un UpdatePanel), ne serait-il théoriquement possible de désactiver ViewState pour toute la page (en Directive Page) sans conséquences négatives? Vous devriez le tester complètement, mais ça vaut le coup.

+0

Je vais essayer, la meilleure suggestion jusqu'à présent .. –

0

Pour tous Intéressé Je veux ajouter une solution sur la façon de se débarrasser des données Viewstate sur client. Cela donne au serveur une charge supplémentaire mais si vous êtes dans la même situation que moi et que vous avez beaucoup de puissance de serveur et que vous avez besoin de prendre la charge du client, c'est sympa.

Laissez toutes vos pages de Derive BasePage.cs qui ressemble à ceci Maintenant, vous avez

public class BasePage : System.Web.UI.Page 
{ 
    protected override void SavePageStateToPersistenceMedium(object viewState) 
    { 
     string vsKey = String.Format("VIEWSTATE_{0}_{1}_{2}", base.Session.SessionID, Request.RawUrl, DateTime.Now); 
     Session.Add(vsKey, viewState); 
     ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", vsKey); 
    } 

    protected override object LoadPageStateFromPersistenceMedium() 
    { 
     string vsKey = Request.Form["__VIEWSTATE_KEY"]; 
     return Session[vsKey]; 
    } 
} 

une clé de la session de données viewstate au lieu du viewstate dans votre code ...

fonctionne comme un charme pour moi sur un site Web avec 1000-1200 visiteurs quotidiens ainsi.

Questions connexes