组件开发之ASP.NET中集成资源文件的服务器端控件开发

    一个ASP.net中的控件,往往要使用到一些图片、CSS和脚本JS文件等等,如果要求用户把这些资源文件自己复制到网站目录中,往往让人感觉很麻烦很不专业。如果能够在控件中包含这些资源,能够自动引用,不单单看上去很专业而且少了一些不必要的麻烦,比如资源文件的缺失、应用路径不对等等问题。那么怎么才能做到控件自己携带这些资源文件并且在程序中引用呢?
    一、.Net1.1及以前版本中,FrameWork中没有内置的支持,所以只能自己实现:
    1.利用ASP.net支持子目录中Web.Config的特点,在运行时动态在网站的根目录下创建自己定义的控件的子目录,然后在里面生成一个web.config文件,设置好Http处理程序设置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<system.web>
         
<httpHandlers>
                
<add verb="*" path="*" type="My.WebForm.DateControl.HttpHandler, My.WebForm.DateControl"/>    
        
</httpHandlers>
    
</system.web>
</configuration>
type字符串中时自己实现的HttpHandler类名,后面是所在的Dll文件名称。
    2.实现自己的HttpHandler类,用于返回资源文件,这里针对脚本和图像实现了不同的方法。
自定义HttpHandler

在那两个类中分别实现了读取和返回脚本和图像的数据流, 这个大家都不陌生,就不再缀述了.
    3.再Render时这样引用资源

string path=System.String.Concat(resolvePath, "SCRIPTHANDLER.ASPX?filename=dateCtl.js");
writer.write(
"<img src='"+path+"'>");
其中,resolvePath=Helper.Context.Request.ApplicationPath + 自定义的控件目录。这样由于我们对资源的应用都被子目录中的webconfig配置转换到了我们自定义的HttpHandler来处理,就实现了自包含的资源引用。
    二、。Net2.0中,这些已经用不到了(可恶的微软,沾沾自喜的许多技术都被谋杀了:)). dot Net FrameWork中已经为我们内置了一个HttpHandler,处理资源文件的引用。
    1。在控件中加入类属性WebResourceAttribute
[assembly: WebResource("My.WebForm.ExGridView.Files.ExGridView.js""text/javascript")]
[assembly: WebResource(
"My.WebForm.ExGridView.Files.add.gif""image/gif")]
[assembly: WebResource(
"My.WebForm.ExGridView.Files.cancel.gif""image/gif")]
[assembly: WebResource(
"My.WebForm.ExGridView.Files.delete.gif""image/gif")]
namespace My.WebForm.ExGridView
{
    [ToolboxData(
"<{0}:ExGridView runat=server></{0}:ExGridView>")]
    [ParseChildren(
true)]
    
public class ExGridView : GridView,IPostBackDataHandler

}

   这里要注意的是My.WebForm.ExGridView.Files并不是实际的目录名字,My.WebForm.ExGridView是控件的namespace,只有Files是实际的想对于控件项目的根目录的子目录名称,必须这样全限定名引用,否则找不到资源!另外别忘了把这些资源文件的编译方式生成操作改成“嵌入得资源”
   2。在需要引用的地方使用CLientScriptManager.GetWebResourceUrl获得资源的引用:

btn.CancelImageUrl =  Page.ClientScript.GetWebResourceUrl(this.GetType(),"My.WebForm.ExGridView.Files.cancel.gif");
同样要注意使用全限定名,而且是大小写区分的。好了,在asp.net2.0中就这么简单,从现在开始把资源文件打包到控件中吧。
posted @ 2006-04-24 16:16 大剑师 阅读(1751) 评论(9)  编辑 收藏 网摘 所属分类: ASP.NET 控件开发

  回复  引用  查看    
#1楼2006-04-25 09:03 | henry      
在1.1实现也很简单啊.
控件的Oninit处进行拦截,然后把资源Write出去就可以了.

  回复  引用  查看    
#2楼[楼主]2006-04-25 09:13 | 大剑师      
@henry
不太明白你的意思,拦截控件的OnInit吗?
“资源Write出去”是指写到网站的子目录(如images、scripts)中,然后引用吗?如果是的话,我感觉也可以,但是这样同样需要考虑写到那个目录,是否需要用户指定以及资源文件和用户网站中的资源同名的问题

  回复  引用  查看    
#3楼2006-04-25 10:16 | henry      
@大剑师
不需要写文件的,以流的方式进行输出.
ASP.NET 2.0菜单等控件的脚本输出方式也是这样的。
1.1同样也可以这样做,原理是一样并不复杂。
我自己写的控件都是以这方式来输出脚本和图片的。

  回复  引用  查看    
#4楼[楼主]2006-04-26 11:37 | 大剑师      
@henry
谢谢你的回复,不过我比较愚钝了:(,脚本还可以直接写过去,那图片之类的资源呢?难道是把控件的DLL当作CGI程序使用? 请好歹给点儿提示,比如在Img中怎么引用你的内置图片?

  回复  引用    
#5楼2007-01-25 15:54 | greki[未注册用户]
怎么在自定义控件中,引入css文件
  回复  引用  查看    
#6楼[楼主]2007-01-26 11:40 | 大剑师      
@greki
这个和别的资源没有什么区别啊

注册:
[assembly: WebResource("YH.WebForm.ExGridView.Files.ExGridView.css", "text/css")]

引用:
string s=Page.ClientScript.GetWebResourceUrl(this.GetType(),"My.WebForm.ExGridView.Files.ExGridView.css");
s = "<link rel='stylesheet' type='text/css' href='" + s + "'/>";

  回复  引用    
#7楼2008-03-27 13:06 | vic.x.zhou[未注册用户]
我想问一下啊 就是 我想想查看我的某个自定义控件被哪些.aspx的文件引用了怎么查看 谢谢
  回复  引用    
#8楼2008-03-27 14:17 | dajianshi[未注册用户]
@vic.x.zhou
这个,在你的控件创建或者Render的时候记录一下应该行的

  回复  引用    
#9楼2008-03-27 16:09 | vic.x.zhou[未注册用户]
没有太明白 楼主



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 383626




相关文章:

相关链接: