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 :
Main page Code behind :
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>
User control :
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 behind :
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>
Par avance, merci.
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(); }
Partager