leves

使一切更加简单!

导航

WEB BUILDER中的动态页面生成

 

Web Builder中通过.NET的控件和反射技术,提供一个弹性的、可延伸的机制。使开发人员和管理员能够开发和部署新控件及装配件(.dll),以此来实现与其它系统整合或是扩充网站的功能,增加新的特性。


    Web Builder
可以动态地建立解析页面。让页面依据使用者的身份和个人人设定载入不同的模块和功能。同时可以让使用者自己设定自己的页面模块和功能,如设置页面栏目布局及位置。充分体现智能化和人性化功能。如下图所示:



1:使用者设定自己的页面栏目布局



2Web Builder根据用户设置载入不同的页面模块


        
Web Builder 中,大部分页面都继承同一个页面基类,而这个基类将页面分为5个页面布局区域,如下图所示:


3Web Builder的页面布局区域


    每个
区域都相当于一个容器,可以动态装载不同的模块控件,如web控件.cs和自定义用户控件.ascx以及各类装配件.dll/.exe。这样能够极大地提高程序的重用性、灵活性及扩展性。


    首先,
Web Builder将系统中的所有控件和装配件初始化到一张控件资源表中,包括控件唯一标识,控件类型(.cs/.ascx/.dll/.exe),控件接口,控件路径,加入时间等字段。

     然后,将用户的页面栏目设置也记录到数据库中——系统默认为管理员的页面栏目设置。在Web Builder中,所有的栏目都由控件来生成,而同一种控件可以生成多个栏目。他们之间是一对多的关系(图1)。

当用户请求该页面时,系统首先取得页面的区域栏目设置,根据栏目取得相应的控件信息,如:控件名称,控件方法,控件类型,参数等,这样根据这些信息就可以在页面区域载入相应的控件(图2)。


    载入页面控件的示例代码如下:

    

/// <summary> 

         
/// 载入控件 
         
/// </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技术,相信会取得比较好的用户体验。

   
    相关文章:

posted on 2005-12-05 19:51  leves  阅读(3012)  评论(3编辑  收藏  举报