组件开发之ASP.NET中集成资源文件的服务器端控件开发
来源:互联网 发布:士爵刷枪软件安卓版 编辑:程序博客网 时间:2024/05/03 07:25
一个ASP.net中的控件,往往要使用到一些图片、CSS和脚本JS文件等等,如果要求用户把这些资源文件自己复制到网站目录中,往往让人感觉很麻烦很不专业。如果能够在控件中包含这些资源,能够自动引用,不单单看上去很专业而且少了一些不必要的麻烦,比如资源文件的缺失、应用路径不对等等问题。那么怎么才能做到控件自己携带这些资源文件并且在程序中引用呢?
一、.Net1.1及以前版本中,FrameWork中没有内置的支持,所以只能自己实现:
1.利用ASP.net支持子目录中Web.Config的特点,在运行时动态在网站的根目录下创建自己定义的控件的子目录,然后在里面生成一个web.config文件,设置好Http处理程序设置
2.实现自己的HttpHandler类,用于返回资源文件,这里针对脚本和图像实现了不同的方法。
二、。Net2.0中,这些已经用不到了(可恶的微软,沾沾自喜的许多技术都被谋杀了:)). dot Net FrameWork中已经为我们内置了一个HttpHandler,处理资源文件的引用。
1。在控件中加入类属性WebResourceAttribute
一、.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文件名称。<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*" type="My.WebForm.DateControl.HttpHandler, My.WebForm.DateControl"/>
</httpHandlers>
</system.web>
</configuration>
2.实现自己的HttpHandler类,用于返回资源文件,这里针对脚本和图像实现了不同的方法。
自定义HttpHandler
public class HttpHandler:IHttpHandler
{
#region IHttpHandler 成员
/// <summary>
/// 通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
/// </summary>
/// <param name="context">HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用</param>
public void ProcessRequest(HttpContext context)
{
string filename = context.Request.FilePath;
filename = filename.Substring(filename.LastIndexOf("/")+1).ToUpper();
bool flag = false;
//访问不同的资源 用不同的 Class 处理
if(filename.Equals("IMAGEHANDLER.ASPX"))
{
ImageHandler.ImageContent();
}
else if(filename.Equals("SCRIPTHANDLER.ASPX"))
{
ScriptHandler.ShowScriptContent();
}
else
{
flag = true;
}
if(flag)
{
throw(new HttpException(500,"未知的请求!"));
}
}
/// <summary>
/// 其他请求是否可以使用 IHttpHandler 实例。
/// </summary>
public bool IsReusable
{
get { return true; }
}
public class HttpHandler:IHttpHandler
{
#region IHttpHandler 成员
/// <summary>
/// 通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
/// </summary>
/// <param name="context">HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用</param>
public void ProcessRequest(HttpContext context)
{
string filename = context.Request.FilePath;
filename = filename.Substring(filename.LastIndexOf("/")+1).ToUpper();
bool flag = false;
//访问不同的资源 用不同的 Class 处理
if(filename.Equals("IMAGEHANDLER.ASPX"))
{
ImageHandler.ImageContent();
}
else if(filename.Equals("SCRIPTHANDLER.ASPX"))
{
ScriptHandler.ShowScriptContent();
}
else
{
flag = true;
}
if(flag)
{
throw(new HttpException(500,"未知的请求!"));
}
}
/// <summary>
/// 其他请求是否可以使用 IHttpHandler 实例。
/// </summary>
public bool IsReusable
{
get { return true; }
}
在那两个类中分别实现了读取和返回脚本和图像的数据流, 这个大家都不陌生,就不再缀述了.
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来处理,就实现了自包含的资源引用。writer.write("<img src='"+path+"'>");
二、。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
}
[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中就这么简单,从现在开始把资源文件打包到控件中吧。
- 组件开发之ASP.NET中集成资源文件的服务器端控件开发
- 组件开发之ASP.NET中集成资源文件的服务器端控件开发
- Asp.Net 控件开发之资源文件处理
- Asp.net 组件开发中web资源文件(图片、js)的调用问题
- asp.net 开发中大文件上传组件的解决方案
- B/S开发(三) ASP.NET中服务器端控件与传统HTML元件的区别
- Asp.net组件与控件开发读书笔记
- ASP.NET自定义控件组件开发(二)
- ASP.NET组件与开发之复合控件的事件处理
- .net 组件开发资源
- 探讨微软ASP.NET AJAX控件开发技术(服务器端)
- JS文件中获取asp.net服务器端控件ID
- JS文件中获取asp.net服务器端控件ID
- Asp.Net开发组件
- ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
- ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件
- ASP.NET自定义控件组件开发 第一章:从一个简单的控件谈起
- asp.net 3.5 中MVC Gridview控件的开发
- 数组移动算法
- 利用 ASP.NET 的内置功能抵御 Web 攻击
- 解析Petshop 3.0 简单工厂(Simple Factory)模式
- “IIS配置401错误”完美解决方案
- C#中除去所有在HTML元素中标记
- 组件开发之ASP.NET中集成资源文件的服务器端控件开发
- AjaxPro V.6.2.16.1使用数组报错
- MS-SQL数据库开发常用汇总
- 心碎无痕
- Dead reckoning in Unreal
- 很有意思,也很无奈
- 如何从文件读取 XML(完整例程)
- 在b/s开发中经常用到的javaScript技术
- 使用xml+asp.net打造简单的站点导航&管理站点友情链接