HY, 我目前正在开发一个网页,以显示不同数据库中不同请求的结果。
我设法异步午餐所有请求以获得时间,但我的页面在最后一次结果后没有加载。这是一个问题,因为有些请求在10秒左右。
所以我想在每个请求旁边用一个微调器直接显示页面,并在结果出现时替换它。
但我真的不知道如何做到这一点以及最好的方法是什么...... UpdatePanel,Ajax,jQuery或其他......
我的页面是在我连接的每个数据库的转发器内部使用用户控件构建的,并且每个数据库上的每个请求都有一个转发器。
目前这就是我所拥有的:
主页:
<asp:Repeater ID="rptDbSummary" runat="server" OnItemDataBound="rptDbSummary_ItemDataBound">
<ItemTemplate>
<uc1:DbSummary runat="server" ID="DbSummary1" />
</ItemTemplate>
</asp:Repeater>
主页代码背后:
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();
}
用户控制:
<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>
后面的用户控制代码:
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();
}
先谢谢