Aspを非同期で呼び出す.Netユーザーコントロール

17732 ワード

私たちのプロジェクトでは、非同期で大量のコンテンツをロードすることがよくあります.以前の方法は、バックグラウンドでHtmlをつなぎ合わせてフロントに戻ることでしたが、1ページのデータ量が特に大きい場合は、Htmlをつなぎ合わせる方法で開発効率を低下させるだけでなく、メンテナンスも特に煩わしいです.その後,Handlersを用いてユーザコントロールを呼び出す方式で実行結果を動的に返すことを考えた.
方法は,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     }