有时在做自定义控件时,可能需要包含很多js结合使用, 现在有一种新需求:控件会包含很多js文件,而且不需要用户去指定js的路径,而且可能会根据用户对控件属性不同的设置,选用不同的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 成员#region IHttpHandler 成员

internal const string ResourceHandlerPageName = "js.axd";


/**//// <summary>
/// 处理js.asd?res=autoComplete.js
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)

{
Assembly asm = null;
StreamReader sr = null;
context.Response.Clear();
string resName = context.Request.QueryString["res"];
string resType = resName.Substring(resName.LastIndexOf('.') + 1).ToLower();
asm = Assembly.GetExecutingAssembly();

if (resType=="js")

{
context.Response.ContentType = "text/javascript";
StringBuilder compositeResponse = new StringBuilder();
sr = new StreamReader(asm.GetManifestResourceStream(typeof(JsHttpHandler), "autoComplete.js"));
compositeResponse.Append(sr.ReadToEnd()).Append(Environment.NewLine);
string response = compositeResponse.ToString();
context.Response.Write(response);
}

}

public bool IsReusable

{
get

{
return true;
}
}

#endregion
}
}

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