zoukankan      html  css  js  c++  java
  • ASP.NET 中通过异步的方式调用用户控件

    在我们项目里经常会通过异步的方式加载大量的内容,以前的办法是通过后台拼接 Html 然后返回到前台,如果一个页面的数据量特别大的话用拼接 Html 的方式不仅降低了开发效率维护起来也特别麻烦。后来想到利用 Handlers 调用用户控件的方式动态的把执行结果返回。

    办法是利用了 HttpServerUtility 类的 Execute 方法执行指定虚拟路径的处理程序。

    我写了个 ViewWriter 类来封装:

        /// <summary>
        /// 加载页面视图并渲染。
        /// </summary>
        /// <typeparam name="T">需要渲染的页面实例。</typeparam>
        public class ViewWriter<T> where T : Page
        {
    
            #region Fields...
    
            /// <summary>
            /// 声明页面对象实例。
            /// </summary>
            private Page _page;
    
            #endregion
    
            #region Constructors...
    
            /// <summary>
            /// 初始化 <see cref="ViewWriter"/> 类的新实例。
            /// </summary>
            public ViewWriter()
            {
    
            }
    
            #endregion
    
            #region Properties...
    
            #endregion
    
            #region Methods...
    
            /// <summary>
            /// 根据指定的虚拟路径从文件加载视图对象。
            /// </summary>
            /// <param name="path">控件文件的虚拟路径。</param>
            /// <returns>返回指定类型的控件对象。</returns>
            public T LoadViewControl(string path)
            {
                _page = new Page();
                return (T)_page.LoadControl(path);
            }
    
            /// <summary>
            /// 渲染视图。
            /// </summary>
            /// <param name="control">指定的泛型对象。</param>
            /// <returns>返回执行结果。</returns>
            public string RenderView(T control)
            {
                StringWriter output = new StringWriter();
    
                _page.Controls.Add(control);
                HttpContext.Current.Server.Execute(_page, output, false);
    
                return output.ToString();
            }
    
            #endregion
    
        }

    Handler 的调用方法:

        /// <summary>
        /// Handler 的摘要说明
        /// </summary>
        public class UserControlHandler : IHttpHandler
        {
            #region Fields...
    
            /// <summary>
            /// 城市编号。
            /// </summary>
            private int cityId = 1;
            /// <summary>
            /// 城市名字。
            /// </summary>
            private string name = String.Empty;
            /// <summary>
            /// 分页索引。
            /// </summary>
            private int pageIndex = 0;
            /// <summary>
            /// 分页大小。
            /// </summary>
            private int pageSize = 10;
    
            #endregion
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                ReceiveParam(context);
                WriteControlHtml(context);
            }
    
            /// <summary>
            /// 接收参数
            /// </summary>
            /// <param name="context"></param>
            public void ReceiveParam(HttpContext context)
            {
                cityId = Int32.Parse(RequestUtil.GetQueryString("CityId"));
                name = RequestUtil.GetQueryString("Name");
                pageSize = Convert.ToInt32(RequestUtil.GetQueryString("PageSize"));
                pageIndex = Convert.ToInt32(RequestUtil.GetQueryString("PageIndex"));
            }
    
            /// <summary>
            /// 输出控件 Html 内容
            /// </summary>
            /// <param name="context"></param>
            public void WriteControlHtml(HttpContext context)
            {
                ViewManager<UserControl> vm = new ViewManager<UserControl>();
                var UserControl = vm.LoadViewControl("~/UserControls/UserControl.ascx");
                UserControl.CityId = cityId;
                UserControl.Name = name;
                UserControl.PageIndex = pageIndex + 1;
                UserControl.PageSize = pageSize;
    
                string htmlStr = vm.RenderView(UserControl);
                context.Response.Write(htmlStr);
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }

    作者:Charles Zhang


    出处:https://www.cnblogs.com/weisenz/


    本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。

  • 相关阅读:
    【Linux】解压分卷压缩的zip文件
    kafka数据清理
    在 Kubernetes 上安装 Gitlab CI Runner Gitlab CI 基本概念以及 Runner 的安装
    APM监控--(三)zipkin部署手册
    K8S使用NodePort类型Service
    kubernetes基本概念 pod, service
    rsyslog配置解析
    日志收集之rsyslog to kafka
    linux auditd审计的简单使用和理解
    Nginx的try_files指令使用实例
  • 原文地址:https://www.cnblogs.com/weisenz/p/3015957.html
Copyright © 2011-2022 走看看