IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Ma page web consomme beaucoup de ressources du client lors de l'affichage.


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut Ma page web consomme beaucoup de ressources du client lors de l'affichage.
    Bonjour tout le monde,
    j'ai un souci avec une gridView qui met du temps a s'afficher.
    Dans les faits, si je fait une pagination avec pagesize=100, tout va bien, mais si j'affiche au dessus de cette valeur, ca rame fortement.

    Je me suis rendu compte que le probleme venait d'une colonne constituée d'un item template , de hiddenfields, textbox et un regularExpressionValidator.

    voici le code de la colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
     
    <asp:TemplateField FooterStyle-HorizontalAlign="right" HeaderText="<%$ Resources:GL, gl_objectifs_valides %>"
                                ItemStyle-HorizontalAlign="Right" ItemStyle-Width="10%">
                                    <ItemTemplate>
                                        <div>
                                            <asp:HiddenField ID="hdfGlTerrainId" Value='<%#Eval("gl_terrain_id") %>' runat="server" />
                                            <asp:HiddenField ID="hdfGlPerimetreId" Value='<%#Eval("gl_perimetre_id") %>' runat="server" />
                                            <asp:HiddenField ID="hdfGlRayonId" Value='<%#Eval("gl_rayon_id") %>' runat="server" />
                                            <asp:Image ID="cadenas" runat="server" ImageUrl='~/style/1/images/pic_cadenas_on.gif' Visible='<%# bool.Parse(Eval("est_valide").ToString()) %>' />
                                            <asp:TextBox ID="txtObjectifValide" Style="text-align: right;" runat="server" Text='<%# this.AfficheMontant(Eval("objectif_valide")) %>'
                                                ValidationGroup="update" width="60%" Enabled='<%# !bool.Parse(Eval("est_valide").ToString()) %>' onchange="jsChangeIndice(this.id, 'txtObjectifValide')" /> 
                                                <%# this.SumObjectifs(Eval("objectif_valide")) %>
                                             <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ErrorMessage="<%$ Resources:GL,gl_champs_obligatoirs %>"
                                            ControlToValidate="txtObjectifValide" ValidationGroup="update" ValidationExpression="<%$ Resources:GL,gl_regex_montant %>" />
     
                                        </div>
                                    </ItemTemplate>
                                    <FooterTemplate>
                                     <%# this.AfficheMontant(this.TotalObjectif) %>
                                    </FooterTemplate>
                                </asp:TemplateField>
    Quand je retire l'appel au javascript de la propriété onchange ET le regularExpressionValidator, l'affichage est instantané.

    Est ce que je m'y suis mal pris ?
    Est ce qu'un regularExpressionValidator est un procédé a éviter ?
    Dois je renoncer au javascript ?

    J'avoue être un peu perdu la....

    voici le javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    function jsChangeIndice(id,inputName)
            {
                  var prefix = id.replace (inputName, '');
     
                  var valObj = document.getElementById(prefix+"txtObjectifValide");
     
                  var valIndice = document.getElementById(prefix+"indice_temp");
     
                  var valCA = document.getElementById(prefix+"Label1");
     
     
                  var newCA = valCA.value.replace(/\s+/g,'');
                  newCA = newCA.replace(/ /g, "");
     
                  var newObj = valObj.value.replace(/\s+/g,'');
                  newObj = newObj.replace(/ /g, "");
     
                  var p=eval(newObj/newCA*100);
                  valIndice.innerText=p.toFixed(1);
            }

    Merci à tous pour votre attention.

    Edit:
    le calcul prend 100% d'un cœur de mon proc pour afficher le rendu.
    Ca retombe a 3% une fois terminée.

  2. #2
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Comme je n'arrive pas à rendre la vitesse d'affichage plus efficiente, est ce qu'il y aurait un moyen d'afficher un message le temps que la grille se mette en place ?

    j'ai essayé avec des update panel et update progress panel, mais ca ne marche pas (j'ai pourtant mis la meme mecanique en place sur d'autres dev, et ca fonctionne, mais la, impossible)

    j'ai aussi essayé de faire ca avec des css, mais cela ne marche pas non plus...

    Du coup, je pense que je ne dois pas m'y prendre correctement, donc si vous avez une methode simple, je suis preneur
    merci

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,

    Je dirais que tu devrais continuer de creuser pour rendre ta page plus performante. D'une façon générale une page web n'est pas faire pour traiter beaucoup de données. J'aurais tendance à dire que ton approche n'est pas bonne.
    Sur un de mes projets on a beaucoup de données à insérer en base. Pour le faire proprement on utilise un fichier XML ouvert avec Excel. Ce fichier une fois traité est téléchargé sur le serveur et si les données son bonnes elle sont insérées.

    A+

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Je suis entièrement d'accord avec toi. L'ennui c'est que le client veut absolument faire comme j'ai décrit.

    j'essaie de simplifier le code, mais bon, ca n'apporte rien de d'efficace


    edit:
    faute de frappe

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Hummm, moi aussi je serais porté à vous dire que vous n'allez pas dans la bonne direction.

    Toutefois, j'ai déjà été dans le même pétrain que vous, mon patron voulait IMPÉRATIVEMENT avoir une page avec une grille de + de 500 lignes sans aucune possibilité de pagination... Bon, parfois vaut mieux faire ce qu'ils veulent, mais pensez simplement à les mettres en garde.

    Alors, voilà ce que je vous propose en guise d'amélioration. Ce sera peut-être pas la mer à boire, mais ça sera déjà ça.

    • Premièrement, avez-vous vraiment besion du ViewState ? Si non, alors désactivé-le. Vous sauverez ainsi beaucoup de bandwith et de traitement de données inutile au rendu du navigateur.
    • Je remarque que vous utilisez trois champs HiddenField dans votre grille. Vous pourriez en faire qu'un seul et y placer les ID séparé par des ";".

      Sinon, est-ce que ces valeurs sont des clés pour la base de données ? Si oui, alors pourquoi ne pas les mettres dans le DataKeys de votre grille ? Vous éviteriez ainsi vos 3 hiddens fields pour chaque ligne.
    • Vous utilisez un RegularExpressionValidator, ceci-dit ce dernier est rendu puor chaque ligne de votre grille. J'ai déjà eu des problèmes de lenteur avec ceux-ci quand ils sont en trop grand nombre, et c'est encore pire lorsqu'ils sont couplés avec un ValidatorCalloutExtender ! Bref, vous pourrez appeler une fonction javascript qui effectue la validation à partir de chacun des boutons de postback de votre grille --> onclienclick="validerData(); return false;".

      Cependant, si votre bouton de postback est pour toute la grille, alors là, il est possible de faire code javascript qui balaye toute la grille à la recherche d'erreur. Encore là, à mon avis vous sauverez par rapport à un Validator par ligne qui est répété sur x lignes.


    Pour le reste, il y a MasterCard

    Bonne chance

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    Merci pour les pistes !

    J'ai résolu mon problème en enlevant le RegularExpressionValidator quand effectivement je me suis rendu compte qu'il en faisait pour chaque ligne ...

    bref j'ai tout refait en javascript moi même et c'est nettement mieux, je suis passé de 9 minutes pour afficher 4000 lignes a 1 minute 30

    Sinon oui mes hiddenfield sont bien des clefs de la base, j'ai effectivement bien envie de rassembler tout ca en une passe.

    Maintenant, c'est l'enregistrement qui est un peu long. j'ai voulu avec ontextchanged sauver que les lignes qui étaient modifiées mais la autopostback fait un "refresh" a chaque changement, et je ne voudrais pas qu'il le fasse.
    juste il fait appel a la fonction derrière sans faire un refresh sur la gridview . . .

    je vais ouvrir un fil a ce sujet ...

    Merci bcp

  7. #7
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Pour la sauvegarde, vous devriez le faire seulement une ligne à la fois. C'est une très bonne idée.

    Toutefois, je vous conseil de créer une fonction javascript que vous appelerez, et qui elle utilisera une PageMethod via AJAX pour effectuer la sauvegarde dans la BD.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [System.Web.Services.WebMethod]
    public static void SauvegarderLigneGridView(string keys, string newData)
    {
        try
        {
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    Cherchez sur Google à ce propos, vous trouverez de bonnes exemples

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 90
    Points : 71
    Points
    71
    Par défaut
    intéressant je vais voir ca !.
    la seule chose c'est que je suis dans un environnement particulier, je développe des écrans spécifiques d'un progiciel. je dois donc jongler avec les pre requis et les recommandation du progiciel.

    Et c'est notamment le cas pour tout ce qui concerne les accès aux bases de données, ou on ne fait pas de requête direct mais on passe par des méthodes du progiciel qui s'occupe d'appeler des procédures stockées en bases (que nous faisons nous même).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSP][WEB] recuperer le contenu d'une page web
    Par ypikahe dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 14/03/2008, 11h10
  2. application qui connecte sur une page web
    Par spoolz dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 14/04/2004, 10h47
  3. [Réseau]Récupération de page Web
    Par n1c0las dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 27/03/2004, 19h15
  4. ouvrir une page Web en mode texte
    Par Halleck dans le forum Windows
    Réponses: 7
    Dernier message: 03/03/2004, 16h08
  5. Réponses: 3
    Dernier message: 28/10/2003, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo