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 :

MAJ d'une page après le retour de requêtes Asynchrones


Sujet :

ASP.NET

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Points : 46
    Points
    46
    Par défaut MAJ d'une page après le retour de requêtes Asynchrones
    Bonjour,

    Je développe actuellement une page web qui présente de résultat de différentes requêtes sur déférentes bases.
    J'ai réussi à lancer toutes ces requêtes de façon asynchrone pour gagner du temps, mais ma page finie de se charger après le retour de tous les résultats. Le problème est que pour une des bases les requêtes peuvent mettre jusqu'à 10 secondes.
    Je voudrais donc que la page se charge directement avec un spinner pour chaque requête et que le résultat se mette à jour lorsqu'il est disponible mais je ne sais pas trop comment réaliser cela... UpdatePanel, Ajax, Jquery, ...

    Du coup actuellement (par rapport au code présenté), j'essaye de faire un appel jQuery à une méthode static pour faire les appels pour chaque bases/requêtes mais je galère... déjà pour récupérer le bon libellé dans la page et je n'ai pas encore regardé la partie faire l'appel asynchrone et que ça mette à jour au retour.
    Donc si vous pouvez m'aider ou au moins m'orienter ça serait avec super.

    Ma page est construite de la manière suivante, à savoir, un repeater contenant un userControl pour chaque base dans la page principale et un repeater pour chaque requête pour la base.
    Ce qui donne :

    Main page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        <asp:Repeater ID="rptDbSummary" runat="server" OnItemDataBound="rptDbSummary_ItemDataBound">
            <ItemTemplate>
                <uc1:DbSummary runat="server" ID="DbSummary1" />
            </ItemTemplate>
        </asp:Repeater>
    Main page Code behind :
    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
    protected void Page_Load(object sender, EventArgs e)
        {
            BindDbSummary();
        }
     
        protected void rptDbSummary_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            ucDbSummary ctrl = (ucDbSummary)e.Item.FindControl("DbSummary1");
            var db = (DatabaseApplicatif)e.Item.DataItem;
            ctrl.BindData(db);
        }
     
        private void BindDbSummary()
        {
            var dbs = confManager.Platforms.SelectMany(p => p.Databases);
            rptDbSummary.DataSource = dbs;
            rptDbSummary.DataBind();
        }
    User control :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <table class="tableSummary">
                <asp:Repeater runat="server" ID="rptDbQuery" OnItemDataBound="rptDbQuery_ItemDataBound">
                    <ItemTemplate>
                        <tr>
                            <td><asp:Label runat="server" ID="lblQueryName"></asp:Label></td>
                            <td><asp:Label runat="server" ID="lblQueryData"><i class="fa fa-spinner fa-spin fa-fw"></i></asp:Label> </td>
                        </tr>
                    </ItemTemplate>
                </asp:Repeater>
            </table>
    User Control code behind :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    protected void Page_Load(object sender, EventArgs e)
        {
        }
     
        protected async void rptDbQuery_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            var item = (IpQuery)e.Item.DataItem;
            var name = (Label)e.Item.FindControl("lblQueryName");
            var req = (Label)e.Item.FindControl("lblQueryData");
     
            try
            {
                name.Text = (string)HttpContext.GetGlobalResourceObject("RunReport", item.Label, Thread.CurrentThread.CurrentCulture);
     
                var res = await Task.Run(() => doAsyncOperation(item.Postgre, item.IpAdr, item.Sql));
                req.Text = res;
            }
            catch (Exception ex)
            {
                req.Text = string.Format("error : {0}", ex.Message);
            }
        }
     
        public async Task<string> doAsyncOperation(bool postgre, string ipAdr, string request)
        {
            var dbManager = new DbLogManager();
            var res = await dbManager.GetRequestResult(postgre, ipAdr, request);
            return res;
        }
     
        public void BindData(DatabaseApplicatif db)
        {
            var queries = new List<IpQuery>();
     
            lblDbName.Text = db.Label;
            foreach (var q in db.Queries)
            {
                queries.Add(new IpQuery
                {
                    Postgre = db.Postgre,
                    IpAdr = db.IPServer,
                    Label = q.Label,
                    Sql = q.SQL
                });
            }
     
            rptDbQuery.DataSource = queries;
            rptDbQuery.DataBind();
        }
    Par avance, merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    Si je devais faire cela en webform, je créerais un handler (ashx) qui s'occuperait d’exécuter les différents query et retournerait au format json les données. Côté client je construit mon résultat en JS...(Call ajax à l'handler + traitement du résultat)

Discussions similaires

  1. Afficher texte dans une textbox apres un retour de page
    Par Loukas42 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/01/2011, 11h42
  2. Afficher une page après le menu
    Par Samanta dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 13/03/2006, 14h53
  3. Afficher une page après le menu
    Par Samanta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 08/03/2006, 18h22
  4. Actualiser une page après un "header location"
    Par salva57 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 15
    Dernier message: 10/01/2006, 22h09
  5. Rechargement d'une page après ouverture de deux popups
    Par petitmoosse dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/11/2005, 16h39

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