小强


For my summer
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

学习ASP.NET Starter Kit[Portal](20050701)

Posted on 2005-07-01 17:18  小 强  阅读(744)  评论(0编辑  收藏  举报

今天主要是想搞清楚,网站是怎么样根据PortalCfg.xml里的配置信息来更改页面,实现这种灵活配置的功能的.主要涉及到的文件有配置文件及相关的架构和数据集文件(PortalCfg.xml, PortalCfg.xsd, PortalCfg.cs),Global.asaxConfiguration.cs这几个文件,然后就是根据具体的页面来看里面到底是怎么在工作的(DesktopPortalBanner.ascs, DesktopDefault.aspx.

看过之后也觉得不是很难,主要描述如下:

1.       客户端发起一个请求后, BeginRequest事件被触发,Global类里的Application_BeginRequest方法执行,这个方法首先获得Url中传的两个参数tabIndex(页面导航控件中,标签在DataList中的索引.主要是确定选择了哪个链接,然后会让该链接失效,即不能在本页面点击本页面的链接)tabID(这个就是标签的ID).

然后是根据这两个参数,获得一个PortalSettings对象,这个对象就包含了请求的标签连接中所有的配置信息,还获得SiteConfiguration 对象(xml配置文件的处理类的实例), 并将这个对象存放在HttpContext.Current.Items,以便其他地方使用起来很方便.(以前没这样用过!)

2.       DesktopDefault.aspx页面为例,通过下面的代码实现动态的加载页面模块.

// Obtain PortalSettings from Current Context
 PortalSettings portalSettings = (PortalSettings) HttpContext.Current.Items["PortalSettings"];
//.
// Dynamically Populate the Left, Center and Right pane sections of the portal page
if (portalSettings.ActiveTab.Modules.Count > 0{

    
// Loop through each entry in the configuration system for this tab
    foreach (ModuleSettings _moduleSettings in portalSettings.ActiveTab.Modules) {
     Control parent 
= Page.FindControl(_moduleSettings.PaneName);

     
// If no caching is specified, create the user control instance and dynamically
     
// inject it into the page.  Otherwise, create a cached module instance that
     
// may or may not optionally inject the module into the tree

     
if ((_moduleSettings.CacheTime) == 0{

         PortalModuleControl portalModule 
= (PortalModuleControl) Page.LoadControl(_moduleSettings.DesktopSrc);
         portalModule.PortalId 
= portalSettings.PortalId;                                  
                        portalModule.ModuleConfiguration 
= _moduleSettings;
                   
        parent.Controls.Add(portalModule);
      }

  
else {

                        CachedPortalModuleControl portalModule 
= new CachedPortalModuleControl();
                   
                        portalModule.PortalId 
= portalSettings.PortalId;                                 
                        portalModule.ModuleConfiguration 
= _moduleSettings;
 
                        parent.Controls.Add(portalModule);
                    }


                    
// Dynamically inject separator break between portal modules
                    parent.Controls.Add(new LiteralControl("<" + "br" + ">"));
                    parent.Visible 
= true;
                }

            }


总体来说代码不难,if ((_moduleSettings.CacheTime) == 0) {}else{}

   else里面的缓存功能是如何实现的,我还没有搞清楚!!郁闷~~~~~~~

 

就这样动态加载页面模块的功能实现了,现在终于对这个功能有所了解了!!!

~~~~~~~对了,今天还看了角色身份认证的实现,里面竟然还有Bug,郁闷~~~~~~

这个实现得也很简单.

 

明天准备具体的看代码,但也不会很仔细的看,只是大致看看,学习一些编程技巧和补充自己的知识吧!!