asp.net利用ajax和jquery-ui实现进度条

时间:2021-07-08 05:37:59

  前台用ajax不停进行查询,直到任务完成。进度条用的是jquery-ui。后台用一般处理程序处理相应,进度信息保存在HttpContext.Application中。

  代码作为简单示例,实际应用时应对资源释放、防止多线程混乱等做进一步控制。

  • 效果图:

  asp.net利用ajax和jquery-ui实现进度条

  • 代码:

前台:

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title></title>
 6     <script src="Scripts/jquery-2.1.4.min.js"></script>
 7     <script src="Scripts/jquery-ui-1.11.4.min.js"></script>
 8     <link href="Content/themes/base/all.css" rel="stylesheet" />
 9     <script type="text/javascript">
10         function GetProgress() {
11             $.ajax({
12                 url: "/Handler1.ashx",
13                 type: "POST",
14                 data: { "RequestType": "AjaxRequest", "Method": "GetProgress" },
15                 success: function (data) {
16                     if (data != -1) {
17                         //工作没有结束,继续查询进度
18                         setTimeout(GetProgress, 100);
19                         $("#progress").html(data);
20                         $("#progressbar").progressbar({ value: parseInt(data) });
21                     } else {
22                         //工作完成
23                         $("#progress").html("done");
24                         $("#progressbar").progressbar({ value: 100 });
25                         $("#btn1").attr("disabled", false);
26                     }
27                 }
28             });
29         }
30 
31         function DoWork() {
32             //禁用按钮
33             $("#btn1").attr("disabled", true);
34             $.ajax({
35                 url: "/Handler1.ashx",
36                 type: "POST",
37                 data: { "RequestType": "AjaxRequest", "Method": "DoWork" }
38             });
39             //开始查询进度
40             setTimeout(GetProgress, 500);
41         }
42     </script>
43 
44 </head>
45 <body>
46     <div>
47         <input type="button" id="btn1" value="开始" onclick="DoWork();" />
48         <label id="progress"></label>
49         <div id="progressbar"></div>
50     </div>
51 </body>
52 </html>

后台:

 1 // 2015年12月16日 09:53:11 
 2 // David Huang
 3 // 进度条示例
 4 namespace ProgressTest
 5 {
 6     using System;
 7     using System.Threading;
 8     using System.Web;
 9 
10     /// <summary>
11     /// Handler1 的摘要说明
12     /// </summary>
13     public class Handler1 : IHttpHandler
14     {
15         // context
16         private HttpContext context;
17 
18         public bool IsReusable
19         {
20             get
21             {
22                 return false;
23             }
24         }
25 
26         public void ProcessRequest(HttpContext context)
27         {
28             this.context = context;
29             if (context.Request["RequestType"] == "AjaxRequest")
30             {
31                 if (context.Request["Method"] == "GetProgress")
32                 {
33                     context.Response.Clear();
34                     context.Response.Write(this.GetProgress());
35                     context.Response.End();
36                 }
37                 else
38                 {
39                     this.DoWork();
40                 }
41             }
42         }
43 
44         /// <summary>
45         /// 开始工作
46         /// </summary>
47         private void DoWork()
48         {
49             for (int i = 0; i < 100; i++)
50             {
51                 // 记录进度
52                 // 实际应用中需要进一步控制(利用用户信息、cookies等),防止并发造成混乱
53                 this.context.Application["progress"] = i + 1;
54                 Random r = new Random();
55                 Thread.Sleep(r.Next(10, 100));
56             }
57             // 完成后释放资源
58             this.context.Application["progress"] = null;
59         }
60 
61         /// <summary>
62         /// 查询进度
63         /// </summary>
64         /// <returns>进度</returns>
65         private int GetProgress()
66         {
67             if (this.context.Application["progress"] != null)
68             {
69                 return (int)this.context.Application["progress"];
70             }
71             else
72             {
73                 return -1;
74             }
75         }
76     }
77 }