[收藏]ASP.NET Starter Kit 挖宝记专栏:Portal Starter Kit 可抄的寶在那裡?

ASP.NET Starter Kit 挖寶記專欄:

進階開發篇:Portal Starter Kit 可抄的寶在那裡?

作者:周世雄

2003 年 10 月

Portal Starter Kit (入口網站入門套件) 可抄的寶

到了程式設計師「挖寶」的時刻了,美國微軟開發、免費、又開放原始程式碼的 Portal Starter Kit (入口網站入門套件) 中可抄的地方在那裡呢?可以拿來抄的寶 (地方) 包括:

  1. 入口網站引擎動作原理。
  2. Context 物件暫存入口網站設定。
  3. ASP.NET 三層式架構。
  4. 支援行動裝置 (ASP.NET Mobile Controls),支援 Pocket PC 的內建瀏覽器,並提供其他行動裝置的 WAP / WML 語法。

入口網站引擎動作原理

入口網站引擎的動作原理如下:

  1. 讀取入口網站 XML 設定檔到 Context 物件:每次讀取網頁時將執行 Global.asa 之 Application_BeginRequest 副程式,當中將入口網站的 XML 檔設定存入到 Context 物件中。其中將呼叫 /Components/Configuration.vb 的 New()、GetSiteSettings()。
  2. 顯示頁籤與各個模組:將著執行 Default.aspx,非行動裝置導到 DesktopDefault.aspx。於 DesktopDefault.aspx 讀取 Context 物件之入口網站設定以顯示頁籤與各個模組。

入口網站設定 XML 檔

整個入口網站的設定並沒有儲存到資料庫,而是儲存於 XML 檔 (PortalCfg.xml) 當中。

譬如於 [員工訊息] 頁籤於 PortalCfg.xml 的部份:

  
   
       
    
        
    
        
    
          
     
             
      
      
       
       ~/IMAGES/IMAGE19.JPG
      
              
      
      
       
       300
      
              
      
      
       
       400
      
            
     
         
    
        
    
      
   
   

則於 [員工訊息] 頁籤顯示如下圖:

譬如於 [管理員] 頁籤於PortalCfg.xml 的部份:

  
   
       
    
        
    
        
    
        
    
        
    
      
   
   

則於 [管理員] 頁籤顯示各個模組如下圖:

又譬如模組定義於 PortalCfg.xml 的部份:

則於 [管理員] 頁籤顯示如下圖:

Context 物件暫存入口網站設定

入口網站引擎的動作原理的第一個步驟,為讀取入口網站 XML 設定檔到 Context 物件。Portal Starter Kit 採用一個特殊的技巧,使用 Context 物件暫存入口網站的設定,將入口網站的設定儲存於 XML 檔 (PortalCfg.xml) 暫存到 Context 物件。方法為 Global.asa 之 Application_BeginRequest() 副程式當中,將入口網站的 XML 檔設定存入到 Context 物件中後,同一個 Request 到的所有網站中的任何網頁、元件及控制項都可以藉由呼叫 Context 物件中的 PortalSettings 類別來讀取參數設定值。

Application_BeginRequest副程式:

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)  Dim tabIndex As Integer = 0  Dim tabId As Integer = 1  '取得頁籤索引  If Not (Request.Params("tabindex") Is Nothing) Then    tabIndex = CInt(Request.Params("tabindex"))  End If  '取得頁籤代號  If Not (Request.Params("tabid") Is Nothing) Then    tabId = CInt(Request.Params("tabid"))  End If  'HttpContext.Current.Cache的cache(快取記憶體)儲存入口網站XML檔案設定檔, 同一個Request到的所有程式都  可以存取得到  '儲存PortalSettings設定(入口網站設定)到Context物件cache(快取記憶體), 以後可由  HttpContext.Current.Items("PortalSettings")取得PortalSettings設定(入口網站設定)  Context.Items.Add("PortalSettings", New PortalSettings(tabIndex, tabId))  '儲存SiteSettings設定(模組設定)到Context物件cache(快取記憶體), 以後可由  HttpContext.Current.Items("SiteSettings")取得SiteSettings設定(模組設定)  Dim config As Configuration = New Configuration()  Context.Items.Add("SiteSettings", config.GetSiteSettings())  Try    If Not (Request.UserLanguages Is Nothing) Then     'Request.UserLanguages(0) = "zh-tw"     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.     UserLanguages(0))    Else     '若無使用者語言則預設為英語     Thread.CurrentThread.CurrentCulture = New CultureInfo("en-us")    End If    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture  Catch ex As Exception    Thread.CurrentThread.CurrentCulture = New CultureInfo("en-us")  End TryEnd Sub

其中「Dim config As Configuration = New Configuration()」將呼叫 /Components/Configuration.vb 的 New() 副程式:

Public Sub New(ByVal tabIndex As Integer, ByVal tabId As Integer)  '取得設定資料  Dim config As Configuration = New Configuration()  Dim siteSettings As SiteConfiguration = config.GetSiteSettings()  '依照TabOrder排序依次讀取頁籤設定   Dim tRow As SiteConfiguration.TabRow  For Each tRow In siteSettings.Tab.Select("", "TabOrder")    Dim tabDetails As New TabStripDetails()    With tabDetails     .TabId = tRow.TabId     .TabName = tRow.TabName     .TabOrder = tRow.TabOrder     .AuthorizedRoles = tRow.AccessRoles    End With    Me.DesktopTabs.Add(tabDetails)  Next  '若選取的頁籤索引(PortalSettings.ActiveTab)為0, 則改變為第一個TabID   'CType(Me.DesktopTabs(0), TabStripDetails).TabId = 1     If Me.ActiveTab.TabId = 0 Then    Me.ActiveTab.TabId = CType(Me.DesktopTabs(0), TabStripDetails).TabId  End If  '依照TabOrder排序依次讀取行動裝置(Mobile)頁籤設定   Dim mRow As SiteConfiguration.TabRow  For Each mRow In siteSettings.Tab.Select("ShowMobile='true'", "TabOrder")    Dim tabDetails As New TabStripDetails()    With tabdetails     .TabId = mRow.TabId     .TabName = mRow.MobileTabName     .AuthorizedRoles = mRow.AccessRoles    End With    Me.MobileTabs.Add(tabDetails)  Next  '讀取選取頁籤(Active Tab)的模組資料(Module Information)  Dim activeTab As SiteConfiguration.TabRow = siteSettings.Tab.FindByTabId(tabId)  Dim moduleRow As SiteConfiguration._ModuleRow  ' Get Modules for this Tab based on the Data Relation  For Each moduleRow In activeTab.GetModuleRows()    Dim moduleSettings As New moduleSettings()    With moduleSettings     .ModuleTitle = moduleRow.ModuleTitle     .ModuleId = moduleRow.ModuleId     .ModuleDefId = moduleRow.ModuleDefId     .ModuleOrder = moduleRow.ModuleOrder     .TabId = tabId     .PaneName = moduleRow.PaneName     .AuthorizedEditRoles = moduleRow.EditRoles     .CacheTime = moduleRow.CacheTimeout     .ShowMobile = moduleRow.ShowMobile     '取得模組定義資料(ModuleDefinition data)     Dim modDefRow As SiteConfiguration.ModuleDefinitionRow =      siteSettings.ModuleDefinition.FindByModuleDefId(.ModuleDefId)     'URL     .DesktopSrc = modDefRow.DesktopSourceFile     .MobileSrc = modDefRow.MobileSourceFile    End With    Me.ActiveTab.Modules.Add(moduleSettings)  Next  '模組排序(依照ModuleOrder)  Me.ActiveTab.Modules.Sort()  '由第一行取得檔案的Global資料 
   
     Dim globalSettings As SiteConfiguration.GlobalRow = siteSettings.Global.Rows(0)  '讀取Portal global settings   Me.PortalId = globalSettings.PortalId  Me.PortalName = globalSettings.PortalName  Me.AlwaysShowEditButton = globalSettings.AlwaysShowEditButton  Me.ActiveTab.TabIndex = tabIndex  Me.ActiveTab.TabId = tabId  Me.ActiveTab.TabOrder = activeTab.TabOrder  Me.ActiveTab.MobileTabName = activeTab.MobileTabName  Me.ActiveTab.AuthorizedRoles = activeTab.AccessRoles  Me.ActiveTab.TabName = activeTab.TabName  Me.ActiveTab.ShowMobile = activeTab.ShowMobileEnd Sub

其中「config.GetSiteSettings()」將呼叫 /Components/Configuration.vb 的 GetSiteSettings() 函式,儲存入口網站 XML 檔案設定檔到快取記憶體 (cache)HttpContext.Current.Cache:

'取得入口網站XML檔案設定檔Public Function GetSiteSettings() As SiteConfiguration  Dim siteSettings As SiteConfiguration = CType(HttpContext.Current.Cache("SiteSettings"),   SiteConfiguration)  '若SiteConfiguration未儲存於cache(快取記憶體), 則由XML檔案載入到cache.  If siteSettings Is Nothing Then    '產生dataset    siteSettings = New SiteConfiguration()    '取得XML設定檔位置    '於Web.Config讀取位置設定configFile(
   
   )    'ConfigurationSettings.AppSettings("configFile")	= "/PortalVBVS3/PortalCfg.xml"     'configFile = "C:/Program Files/ASP.NET Starter Kits/ASP.NET Portal     (VBVS)/PortalVBVS3/PortalCfg.xml"    Dim configFile As String =     HttpContext.Current.Server.MapPath(ConfigurationSettings.AppSettings("configFile"))    With siteSettings     '設定AutoIncrement屬性為true以便容易加入資料     .Tab.TabIdColumn.AutoIncrement = True     ._Module.ModuleIdColumn.AutoIncrement = True     .ModuleDefinition.ModuleDefIdColumn.AutoIncrement = True     '載入XML資料到DataSet     siteSettings.ReadXml(configFile)    End With    '儲存dataset到cache    HttpContext.Current.Cache.Insert("SiteSettings", siteSettings,     New CacheDependency(configFile))  End If  Return siteSettingsEnd Function

學會 Context 物件的技巧了嗎?

顯示頁籤與各個模組

入口網站引擎的動作原理的第二個步驟,為顯示頁籤與各個模組。DesktopDefault.aspx 負責顯示頁籤與各個模組。動作原理如下:

  1. 顯示頁籤:由 DesktopDefault.aspx 所包括的 DesktopPortalBanner.ascx 負責顯示,資料繫結到頁籤 datalist。
  2. 顯示各個模組:動作原理將 Web 使用者控制項 (.ascx) 的模組,DesktopDefault.aspx 使用「parent.Controls.Add(portalModule)」將模組加入到網頁。

執行 Global.asa 之 Application_BeginRequest 副程式後,將著執行 Default.aspx,非行動裝置導到 DesktopDefault.aspx:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  '由Request.Browser("IsMobileDevice")瀏覽器種類, 來判斷使用者的電腦是否為行動裝置  If Request.Browser("IsMobileDevice") = "true" Then  '若為行動裝置則重新導向到MobileDefault.aspx  Response.Redirect("MobileDefault.aspx")  Else  '若為一般電腦(不是行動裝置)則重新導向到TimeEntry.aspx  Response.Redirect("DesktopDefault.aspx")  End IfEnd Sub

於DesktopDefault.aspx 讀取 Context 物件之入口網站設定以顯示頁籤與各個模組。

由 DesktopDefault.aspx 所包括的 DesktopPortalBanner.ascx 負責顯示頁籤,DesktopPortalBanner.ascx 的相關程式如下,檢查是否有權限瀏覽每一個頁籤後,資料繫結到頁籤 datalist:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load  '由Context物件(HttpContext.Current.Items("PortalSettings"))取得PortalSettings設定(入口網站設定)  Dim _portalSettings As PortalSettings = CType(HttpContext.Current.Items("PortalSettings"),   PortalSettings)  '入口網站名稱, 存於XML檔
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值