利用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,

None.gif using  System;
None.gif
using  System.IO;
None.gif
using  System.Reflection;
None.gif
using  System.Text;
None.gif
using  System.Web;
None.gif
None.gif
namespace  JrtControls
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// 用于处理HttpHandle,需在web.config中<system.web>节点下定义:
InBlock.gif    
///        <httpHandlers>
InBlock.gif    
///            <add verb="*" path="js.axd" type="JrtControls.JsHttpHandler, JrtControls" />
InBlock.gif    
///        </httpHandlers>
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class JsHttpHandler:IHttpHandler
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public JsHttpHandler()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockEnd.gif        }

InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
IHttpHandler 成员#region IHttpHandler 成员
InBlock.gif
InBlock.gif        
internal const string ResourceHandlerPageName = "js.axd";
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 处理js.asd?res=autoComplete.js
InBlock.gif        
/// </summary>
ExpandedSubBlockEnd.gif        
/// <param name="context"></param>

InBlock.gif        public void ProcessRequest(HttpContext context)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Assembly asm 
= null;
InBlock.gif            StreamReader sr 
= null;
InBlock.gif            context.Response.Clear();
InBlock.gif            
string resName = context.Request.QueryString["res"];
InBlock.gif            
string resType = resName.Substring(resName.LastIndexOf('.'+ 1).ToLower();
InBlock.gif            asm 
= Assembly.GetExecutingAssembly();
InBlock.gif
InBlock.gif            
if (resType=="js")
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                context.Response.ContentType 
= "text/javascript";
InBlock.gif                StringBuilder compositeResponse 
= new StringBuilder();
InBlock.gif                sr 
= new StreamReader(asm.GetManifestResourceStream(typeof(JsHttpHandler), "autoComplete.js"));
InBlock.gif                compositeResponse.Append(sr.ReadToEnd()).Append(Environment.NewLine);
InBlock.gif                
string response = compositeResponse.ToString();
InBlock.gif                context.Response.Write(response);
ExpandedSubBlockEnd.gif            }

InBlock.gif
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public bool IsReusable
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return true;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

3.控件实现部分,主要是重写OnPreRender方法注册脚本块:
None.gif          protected   override   void  OnPreRender(EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
base.OnPreRender(e);
InBlock.gif            
string typename =typeof(AutoCompleteBox).ToString().Replace(".""_");
InBlock.gif
InBlock.gif            
//初始化脚本,提供给js.axd?res=autoComplete.js这样的url给HttpHandle处理
InBlock.gif
            if (!Page.IsClientScriptBlockRegistered(typename))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                StringBuilder sb 
= new StringBuilder();
InBlock.gif                sb.Append(
"<script type=\"text/javascript\" src=\"");
InBlock.gif
                sb.Append("js.axd?res=autoComplete.js");
InBlock.gif                sb.Append(
"\"></script>");
InBlock.gif
                Page.RegisterClientScriptBlock(typename,sb.ToString());
ExpandedSubBlockEnd.gif            }

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

ExpandedBlockEnd.gif        }

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

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


源代码下载 /Files/jintan/JrtControls.rar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值