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)。
载入页面控件的示例代码如下:
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
需要注意的是,控件名称ctrlName可以是简单的类型名、包含命名空间的类型名,或是包含程序集名称规范的复杂名称。
如果 ctrlName只包含 Type 的名称,则此方法先是在调用对象的程序集中进行搜索,然后在 mscorlib.dll 程序集中进行搜索。如果 ctrlName用部分或完整的程序集名称完全限定,则此方法在指定的程序集中进行搜索。
以上的代码只是一个示例,出于性能的考虑,Web Builder在实际处理中加入HttpContext.Current.Cache来缓存控件。另外,由于每个控件在执行效率上的区别,页面会等待所有的控件都render之后,才会全部显示,所以,一些处理过程复杂缓慢的控件,最好不要设置到模版页面上。
对于一些调用远程数据的控件,如:rss显示控件(RssWebpart),有可能会长时间等待,或者获取远程数据失败,因此Web Builder采用异步和设置超时来处理,当然如果再采现在比较流行的AJAX技术,相信会取得比较好的用户体验。
相关文章: