WEB BUILDER中的动态页面生成
在Web Builder中通过.NET的控件和反射技术,提供一个弹性的、可延伸的机制。使开发人员和管理员能够开发和部署新控件及装配件(.dll),以此来实现与其它系统整合或是扩充网站的功能,增加新的特性。
Web Builder可以动态地建立解析页面。让页面依据使用者的身份和个人人设定载入不同的模块和功能。同时可以让使用者自己设定自己的页面模块和功能,如设置页面栏目布局及位置。充分体现智能化和人性化功能。如下图所示:
图1:使用者设定自己的页面栏目布局
图2:Web Builder根据用户设置载入不同的页面模块
在Web Builder 中,大部分页面都继承同一个页面基类,而这个基类将页面分为5个页面布局区域,如下图所示:
图3:Web Builder的页面布局区域
每个区域都相当于一个容器,可以动态装载不同的模块控件,如web控件.cs和自定义用户控件.ascx以及各类装配件.dll/.exe。这样能够极大地提高程序的重用性、灵活性及扩展性。
首先,Web Builder将系统中的所有控件和装配件初始化到一张控件资源表中,包括控件唯一标识,控件类型(.cs/.ascx/.dll/.exe等),控件接口,控件路径,加入时间等字段。
然后,将用户的页面栏目设置也记录到数据库中——系统默认为管理员的页面栏目设置。在Web Builder中,所有的栏目都由控件来生成,而同一种控件可以生成多个栏目。他们之间是一对多的关系(图1)。
当用户请求该页面时,系统首先取得页面的区域栏目设置,根据栏目取得相应的控件信息,如:控件名称,控件方法,控件类型,参数等,这样根据这些信息就可以在页面区域载入相应的控件(图2)。
载入页面控件的示例代码如下:
/// 载入控件
/// </summary>
/// <param name="ctrlName">控件名称</param>
/// <param name="interfaceName">方法或者接口名称</param>
/// <param name="crtlType">控件类型</param>
/// <param name="ctrlURI">控件位置,可以为相对或绝对路经与控件的类型有关</param>
/// <param name="param">控件接受参数</param>
public initPageCrtl(string ctrlName, string interfaceName, int crtlType,string ctrlURI ,object[] param)
{
object myObj = null;
if (crtlType == 0)//web控件
{
Type t = Type.GetType(ctrlName);
myObj = Activator.CreateInstance(t, param);
Controls.Add((System.Web.UI.Control)myObj) ;
}
else if ( crtlType == 1)//用户自定义控件
{
System.Web.UI.Control myCtrl = this.LoadControl(ctrlURI);
myCtrl.ID = param.ToString();
Controls.Add(myCtrl);
}
else if(crtlType == 2)//装配件
{
Assembly asm = System.Reflection.Assembly.LoadFile(ctrlURI);
Type t = asm.GetType(ctrlName);
myObj = Activator.CreateInstance(t);
MethodInfo mi = t.GetMethod(interfaceName);
mi.Invoke(myObj,param).ToString();
Controls.Add((System.Web.UI.Control)myObj) ;
}
else
{
//扩充功能,如载入远程控件,webservice等
}
}
需要注意的是,控件名称ctrlName可以是简单的类型名、包含命名空间的类型名,或是包含程序集名称规范的复杂名称。
如果 ctrlName只包含 Type 的名称,则此方法先是在调用对象的程序集中进行搜索,然后在 mscorlib.dll 程序集中进行搜索。如果 ctrlName用部分或完整的程序集名称完全限定,则此方法在指定的程序集中进行搜索。
以上的代码只是一个示例,出于性能的考虑,Web Builder在实际处理中加入HttpContext.Current.Cache来缓存控件。另外,由于每个控件在执行效率上的区别,页面会等待所有的控件都render之后,才会全部显示,所以,一些处理过程复杂缓慢的控件,最好不要设置到模版页面上。
对于一些调用远程数据的控件,如:rss显示控件(RssWebpart),有可能会长时间等待,或者获取远程数据失败,因此Web Builder采用异步和设置超时来处理,当然如果再采现在比较流行的AJAX技术,相信会取得比较好的用户体验。
相关文章: