zoukankan      html  css  js  c++  java
  • 利用HttpHandler处理自定义控件中需要引用大量js文件问题

      有时在做自定义控件时,可能需要包含很多js结合使用,特别是在线编辑器这种重量级的自定义控件,一般的控件可能也会包含很多javascript,我们通常的处理办法有大致有两种:

          1.先构造脚本字符串,然后通过直接用RegisterClientScriptBlock或RegisterStartupScript注册到客户端脚本块
          2.定义一个属性,用于用户指定js脚本路径,自定义控件通过获取这个路径注册脚本块

            第1种方法当然不适合有大量的js的情况,第2种方法有它的优点,也是很常见的一种方式。

            现在有一种新需求:控件会包含很多js文件,而且不需要用户去指定js的路径,而且可能会根据用户对控件属性不同的设置,选用不同的js。现在介绍一个简单的处理办法,提供一个思路。

           这个控件很简单,结合DooIT同学的《输入自动完成类》中的javascript来完成一个简单的自动完成控件。
    1.准备好autoComplete.js文件,并把这个js文件加入到自定义控件项目中,并设置它的"生成操作"属性为"嵌入的资源"。

    2.设计一个处理HttpHandler的类JsHttpHandler,使它实现IHttpHandler接口,处理形如http://xxxx/js.axd这样的带扩展名为.axd的url,
    using System;
    using System.IO;
    using System.Reflection;
    using System.Text;
    using System.Web;

    namespace JrtControls
    {
        
    /// <summary>
        
    /// 用于处理HttpHandle,需在web.config中<system.web>节点下定义:
        
    ///        <httpHandlers>
        
    ///            <add verb="*" path="js.axd" type="JrtControls.JsHttpHandler, JrtControls" />
        
    ///        </httpHandlers>
        
    /// </summary>

        public class JsHttpHandler:IHttpHandler
        
    {
            
    public JsHttpHandler()
            
    {
            }


            
    IHttpHandler 成员
        }

    }


    3.控件实现部分,主要是重写OnPreRender方法注册脚本块:
            protected override void OnPreRender(EventArgs e)
            
    {
                
    base.OnPreRender(e);
                
    string typename =typeof(AutoCompleteBox).ToString().Replace(".""_");

                
    //初始化脚本,提供给js.axd?res=autoComplete.js这样的url给HttpHandle处理
                if (!Page.IsClientScriptBlockRegistered(typename))
                
    {
                    StringBuilder sb 
    = new StringBuilder();
                    sb.Append(
    "<script type=\"text/javascript\" src=\"");
                    sb.Append("js.axd?res=autoComplete.js");
                    sb.Append(
    "\"></script>");
                    Page.RegisterClientScriptBlock(typename,sb.ToString());
                }

        
                
    if (!Page.IsStartupScriptRegistered(typename))
                
    {
                    StringBuilder sb 
    = new StringBuilder();
                    sb.Append(
    "<SCRIPT LANGUAGE='JavaScript'>");
                    sb.Append( 
    " var acbar = new CLASS_AUOTCOMPLETE();");
                    sb.Append( 
    "acbar.setup(document.all."+this.ID+");");
                    sb.Append( 
    "</SCRIPT>");
                    Page.RegisterStartupScript(typename,sb.ToString());
                }

            }

    最后完成后如何使用?
    在web.config中
      <system.web>节点下配置httphandler,注意后面的   type="JrtControls.JsHttpHandler, JrtControls" ,JrtControls.JsHttpHandler代表处理的类的完整名,后面的JrtControls表示类库的名称。
         <httpHandlers>
          
    <add verb="*" path="js.axd" type="JrtControls.JsHttpHandler, JrtControls" />
        
    </httpHandlers>

    最后把控件加入到页面,
    在后台给控件的AutoList属性:
    AutoCompleteBox1.AutoList=new string[]{"123123","123","werewr"};
    运行效果如下:


    源代码下载/Files/jintan/JrtControls.rar
  • 相关阅读:
    elasticsearch-搜索-定位搜索(十一)
    redis-缓存设计-自动延迟调度,最热商品缓存(二)
    20200925
    20175312 2018-2019-2 实验一《Java开发环境的熟悉》实验报告
    20175312 2018-2019-2 《Java程序设计》结对编程练习_四则运算(第一周:阶段性总结)
    20175312 2018-2019-2 《Java程序设计》第5周学习总结
    20175312陶光远 与 20175309刘雨恒 结对
    20175312 2018-2019-2 《Java程序设计》第4周学习总结
    20175312 2018-2019-2 《Java程序设计》第3周学习总结
    20175312 2018-2019-2 《Java程序设计》第2周学习总结
  • 原文地址:https://www.cnblogs.com/cclinux/p/562100.html
Copyright © 2011-2022 走看看