Welcome

首页 / 软件开发 / .NET编程技术 / 另类的动态加载用户控件

另类的动态加载用户控件2011-01-25 博客园 姜敏在BS架构这块,我们平时建一个网站,通常是创建一个WebSite网站,或者是创建一个WebApplication.然后在WEB项目里面建立相应的aspx文件,以及用户控件,自定义控件等等.但是做为一个新加入此项目的你要去修改里面的

某一个功能模板,那么我一般的程序是这样的:

第一:根据新的需求,在项目找到相关页面,例如对应的页面URL为index.aspx.此时可以对原页面做最初的了解.

第二:分析代码.

第三:根据新的需求来修改代码.

我想这也是一般朋友的思维模式吧.可是这样的流程并不是统一不变的,至于如何变化,我先想和园友们讨论一下如下的需求大家是如何实现的?

网站可能有多个版本,例如最起码的中英日版,各版本的内容呈现风格上也略有不同.

本人列举三个本人想到的做法:

第一种方法:每个版本单独建一个站点.具体要求具体实现.这种做法的缺点是维护困难,成本高.

第二种方法:建一个站点,为每个版本的同一个功能页面分别创建单独的页面.例如一个显示新闻的页面,分别为:中文新闻.aspx,英文新闻.aspx等.这种方法的缺点同上,只不过稍微会容易点.

第三种方法:建一个站点,一个功能就建一个页面,但为不同版本创建不同的用户控件,根据相应的参数为动态加载控件.这种做法是最优的.(个人认为)这做做法的缺点是程序的耦合度太强,如果是要增加一个版本,那么就要修改功能页面.

其实上面的第三种方法一般来说是可以解决问题的.后来在新的项目中发现了httpHandler的应用,可以自定义的捕捉到http请求.发现了一个全新的解决方案.

IHttpHandlerFactory在.net中算是用处比较多的。它能够在Hander对象生成前对当前页面的Hander进行预处理。一般我们如果是做URL重写的话,也会用到httphandler,现在可以利用它来实现我上面的需求.

网站呢,就建一个页面webform2.aspx.在这个页面中根据请求的URL来动态加载用户控件.而这个动态加载程序并不是写在webform2中的pageload事件中.而是写的页面的AddParsedSubObject事件中.当用户访问别外一个页面,例如一个搜索页search.aspx,此时站中并不实际存在这个页面.而是利用httphandler来捕获这个HTTP请求,定向于已经实际存在的webform2.aspx页面,在webform2.aspx页面中的AddParsedSubObject事件中完成搜索控件的加载.

第一:如何来自定义的来捕获HTTP请求呢?

1:建立一个实现了接口IHttpHandlerFactory的类.

IHttpHandlerFactory 类型公开了以下成员。

方法 :

GetHandler 返回实现 IHttpHandler 接口的类的实例。

ReleaseHandler 使工厂可以重用现有的处理程序实例。

Code

public class WebPageHandlerFactory : IHttpHandlerFactory
{
public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string path)
{
if (IsExistedPage(path))
{
return PageParser.GetCompiledPageInstance(url, path, context);
}
if (!path.ToLower().EndsWith(".aspx"))
{
path = Path.Combine(path, "webform2.aspx");
}
url = ReplaceUrl(url);
path = ReplaceUrl(path);
return PageParser.GetCompiledPageInstance(url, path, context);
}
/**//// <summary>
/// 判断当前请求的URL是否真实存在
/// </summary>
/// <param name="path">请求URL的相对路径</param>
/// <returns></returns>
private bool IsExistedPage(string path)
{
//首页是已经存在的
if (path.ToLower().IndexOf("webform2.aspx") > 0)
{
return true;
}
return false;
}
/**//// <summary>
/// 把实际不存在的页面名称转换成已经真实存在的default.aspx
/// 例如:default2.aspx实际不存在,则把default2.aspx转换成default.aspx
/// </summary>
/// <param name="input">当前请求的但实际并不存在的URL 例如:default2.aspx</param>
/// <returns></returns>
private string ReplaceUrl(string input)
{
// Regex search and replace
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"w+.aspx", options);
string replacement = @"webform2.aspx";
string result = regex.Replace(input, replacement);
return result;
}
public virtual void ReleaseHandler(IHttpHandler handler)
{
}
}