Aspを非同期で呼び出す.Netユーザーコントロール
17732 ワード
私たちのプロジェクトでは、非同期で大量のコンテンツをロードすることがよくあります.以前の方法は、バックグラウンドでHtmlをつなぎ合わせてフロントに戻ることでしたが、1ページのデータ量が特に大きい場合は、Htmlをつなぎ合わせる方法で開発効率を低下させるだけでなく、メンテナンスも特に煩わしいです.その後,Handlersを用いてユーザコントロールを呼び出す方式で実行結果を動的に返すことを考えた.
方法は,HttpServerUtilityクラスのExecuteメソッドを用いて仮想パスを指定するハンドラを実行することである.
私はViewWriterクラスを書いてカプセル化しました.
Handlerの呼び出し方法:
方法は,HttpServerUtilityクラスのExecuteメソッドを用いて仮想パスを指定するハンドラを実行することである.
私はViewWriterクラスを書いてカプセル化しました.
1 /// <summary>
2 /// 。
3 /// </summary>
4 /// <typeparam name="T"> 。</typeparam>
5 public class ViewWriter<T> where T : Page
6 {
7
8 #region Fields...
9
10 /// <summary>
11 /// 。
12 /// </summary>
13 private Page _page;
14
15 #endregion
16
17 #region Constructors...
18
19 /// <summary>
20 /// <see cref="ViewWriter"/> 。
21 /// </summary>
22 public ViewWriter()
23 {
24
25 }
26
27 #endregion
28
29 #region Properties...
30
31 #endregion
32
33 #region Methods...
34
35 /// <summary>
36 /// 。
37 /// </summary>
38 /// <param name="path"> 。</param>
39 /// <returns> 。</returns>
40 public T LoadViewControl(string path)
41 {
42 _page = new Page();
43 return (T)_page.LoadControl(path);
44 }
45
46 /// <summary>
47 /// 。
48 /// </summary>
49 /// <param name="control"> 。</param>
50 /// <returns> 。</returns>
51 public string RenderView(T control)
52 {
53 StringWriter output = new StringWriter();
54
55 _page.Controls.Add(control);
56 HttpContext.Current.Server.Execute(_page, output, false);
57
58 return output.ToString();
59 }
60
61 #endregion
62
63 }
Handlerの呼び出し方法:
1 /// <summary>
2 /// Handler
3 /// </summary>
4 public class UserControlHandler : IHttpHandler
5 {
6 #region Fields...
7
8 /// <summary>
9 /// 。
10 /// </summary>
11 private int cityId = 1;
12 /// <summary>
13 /// 。
14 /// </summary>
15 private string name = String.Empty;
16 /// <summary>
17 /// 。
18 /// </summary>
19 private int pageIndex = 0;
20 /// <summary>
21 /// 。
22 /// </summary>
23 private int pageSize = 10;
24
25 #endregion
26
27 public void ProcessRequest(HttpContext context)
28 {
29 context.Response.ContentType = "text/plain";
30 ReceiveParam(context);
31 WriteControlHtml(context);
32 }
33
34 /// <summary>
35 ///
36 /// </summary>
37 /// <param name="context"></param>
38 public void ReceiveParam(HttpContext context)
39 {
40 cityId = Int32.Parse(RequestUtil.GetQueryString("CityId"));
41 name = RequestUtil.GetQueryString("Name");
42 pageSize = Convert.ToInt32(RequestUtil.GetQueryString("PageSize"));
43 pageIndex = Convert.ToInt32(RequestUtil.GetQueryString("PageIndex"));
44 }
45
46 /// <summary>
47 /// Html
48 /// </summary>
49 /// <param name="context"></param>
50 public void WriteControlHtml(HttpContext context)
51 {
52 ViewManager<UserControl> vm = new ViewManager<UserControl>();
53 var UserControl = vm.LoadViewControl("~/UserControls/UserControl.ascx");
54 UserControl.CityId = cityId;
55 UserControl.Name = name;
56 UserControl.PageIndex = pageIndex + 1;
57 UserControl.PageSize = pageSize;
58
59 string htmlStr = vm.RenderView(UserControl);
60 context.Response.Write(htmlStr);
61 }
62
63 public bool IsReusable
64 {
65 get
66 {
67 return false;
68 }
69 }
70 }