ASP.NET Starter Kit掘宝記コラム:Portal Starter Kit写しられる宝はどこですか?
著者:周世雄
2003年10月
プログラマーの「宝を掘る」時が来た.アメリカのマイクロソフトが開発し、無料で、オリジナルのプログラムコードを開放したPortal Starter Kit(入口サイト入門キット)で写すことができる場所はどこですか?写すことができる宝(場所)には、
が含まれています.- 入口サイトエンジン動作原理.
- Context物件一時預かり入口サイト設定.
- ASP.NET 3層アーキテクチャ.
- サポート行動装置(ASP.NET Mobile Control)は、Pocket PCの内蔵ブラウザをサポートし、他の行動装置のWAP/WML構文を提供する.
ポータルサイトエンジンの動作原理は以下の通りである:
- ポータルサイトXML設定ファイルをContext物件に読み込む:ページを読み取るたびにGlobalが実行される.asaのApplication_BeginRequestサブルーチンでは,ポータルサイトのXMLファイル設定をContext物件に格納する.ここではComponentsConfigurationと呼びます.vbのNew()、GetSiteSettings().
- ページのチェックと各モジュールを表示する:Defaultが実行される.aspx、非行動装置はDesktopDefaultに導く.aspx.DesktopDefault.aspxはContext物件のエントリサイト設定を読み込み、ページチェックと各モジュールを表示します.
ポータルサイト全体の設定はリポジトリに格納されず、XMLファイル(PortalCfg.xml)に格納される.
例えば[従業員メッセージ]ページはPortalCfgに署名する.xmlの部分:
<Tab TabId="2" TabName=" " AccessRoles="All Users;" TabOrder="9" ShowMobile="true" MobileTabName="HR"> <Module ModuleId="9" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="2" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="1" ShowMobile="true" /> <Module ModuleId="10" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="10" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="3" ShowMobile="false" /> <Module ModuleId="43" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="6" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="5" ShowMobile="false"> <Settings> <Setting Name="src">~/IMAGES/IMAGE19.JPG</Setting> <Setting Name="height">300</Setting> <Setting Name="width">400</Setting> </Settings> </Module> <Module ModuleId="44" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="8" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="7" ShowMobile="false" /> </Tab>
は、[従業員メッセージ]ページに次の図を表示します.
例えば[管理者]ページはPortalCfgに署名する.xmlの部分:
<Tab TabId="6" TabName=" " AccessRoles="Admins;" TabOrder="17" ShowMobile="false" MobileTabName="Admin"> <Module ModuleId="28" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="11" PaneName="RightPane" CacheTimeout="0" ModuleOrder="1" ShowMobile="false" /> <Module ModuleId="29" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="14" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="1" ShowMobile="false" /> <Module ModuleId="30" ModuleTitle=" (Tab)" EditRoles="Admins;" ModuleDefId="13" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="2" ShowMobile="false" /> <Module ModuleId="31" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="12" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="3" ShowMobile="false" /> <Module ModuleId="32" ModuleTitle=" " EditRoles="Admins;" ModuleDefId="15" PaneName="ContentPane" CacheTimeout="0" ModuleOrder="4" ShowMobile="false" /> </Tab>
では、[管理者]ページに各モジュールを以下の図に示す.
例えば、モジュールはPortalCfgに定義.xmlの部分:
<ModuleDefinition FriendlyName=" " MobileSourceFile="MobileModules/Announcements.ascx" DesktopSourceFile="DesktopModules/Announcements.ascx" ModuleDefId="1" /> <ModuleDefinition FriendlyName=" " MobileSourceFile="MobileModules/Contacts.ascx" DesktopSourceFile="DesktopModules/Contacts.ascx" ModuleDefId="2" /> <ModuleDefinition FriendlyName=" " MobileSourceFile="" DesktopSourceFile="DesktopModules /Discussion.ascx" ModuleDefId="3" />… <ModuleDefinition FriendlyName=" (Admin)" MobileSourceFile="" DesktopSourceFile="Admin /SiteSettings.ascx" ModuleDefId="14" /> <ModuleDefinition FriendlyName=" (Admin)" MobileSourceFile="" DesktopSourceFile="Admin /Users.ascx" ModuleDefId="15" /> <ModuleDefinition FriendlyName=" " MobileSourceFile="DesktopModules/MyURL.ascx" DesktopSourceFile="DesktopModules/MyURL.ascx" ModuleDefId="16" />
は、[管理者]ページに次の図を表示します.
ポータルサイトエンジンの動作原理の第1ステップは,ポータルサイトXMLを読み取るためにContext物件にアーカイブを設定する.Portal Starter Kitは、Context物件をポータルサイトに一時保存する設定を使用して、ポータルサイトの設定をXMLファイル(PortalCfg.xml)に一時保存する特殊なテクニックを採用しています.方法は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()」は、ComponentsConfigurationと呼びます.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()」はComponentsConfigurationと呼びます.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物件のテクニックを習得しましたか?
エントリサイトエンジンの動作原理の第2のステップは、各モジュールにラベルを表示することである.DesktopDefault.aspxは、各モジュールにラベルを表示する責任を負います.動作原理は以下の通りである:
- 表示ページタグ:DesktopDefault.aspxに含まれるDesktopPortalBanner.ascxは表示を担当し、資料はページに署名してdatalistします.
- 各モジュールを表示する:動作原理はWeb利用者制御項(.ascx)のモジュール,DesktopDefault.aspxは「parent.controls.Add(portalModule)」を使用してモジュールをWebページに追加します.
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 <Global PortalId="0" PortalName="Portal Starter Kit " siteName.Text = _portalSettings.PortalName ' If Request.IsAuthenticated = True Then WelcomeMessage.Text = " " & Context.User.Identity.Name & "! <" & "span class=Accent" & ">| <" & "/span" & ">" ' If Context.User.Identity.AuthenticationType = "Forms" Then LogoffLink = "<" & "span class=""Accent"">|</span>" & ControlChars.Cr & "<" & "a href=" & Global.GetApplicationPath(Request) & "/Admin/Logoff.aspx class=SiteLink> " & "<" & "/a>" End If End If If ShowTabs = True Then tabIndex = _portalSettings.ActiveTab.TabIndex ' Dim authorizedTabs As New ArrayList() Dim addedTabs As Integer = 0 Dim i As Integer For i = 0 To _portalSettings.DesktopTabs.Count - 1 Dim tab As TabStripDetails = CType(_portalSettings.DesktopTabs(i), TabStripDetails) ' If PortalSecurity.IsInRoles(tab.AuthorizedRoles) Then authorizedTabs.Add(tab) End If If addedTabs = tabIndex Then tabs.SelectedIndex = addedTabs End If addedTabs += 1 Next i ' tabs.DataSource = authorizedTabs tabs.DataBind() End IfEnd Sub
Security.vbのIsInRole()は、次のように、各ページのラベルを参照する権限があるかどうかを確認します.
Public Shared Function IsInRole(ByVal role As String) As Boolean Return HttpContext.Current.User.IsInRole(role)End Function
次はDesktopDefault.aspxは各モジュールを表示する、ポータルサイトXMLのファイル設定に従って、この選択ページに署名するページのモジュール(.ascx)を左、中間、右のレイアウト、DesktopDefaultに追加する.aspxの関連プログラムは以下の通りである:
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init ' Context (HttpContext.Current.Items("PortalSettings")) PortalSettings ( ) Dim _portalSettings As PortalSettings = CType(HttpContext.Current.Items("PortalSettings"), PortalSettings) ' , AccessDenied.aspx, _portalSettings.ActiveTab.AuthorizedRoles = "All Users;" If PortalSecurity.IsInRoles(_portalSettings.ActiveTab.AuthorizedRoles) = False Then Response.Redirect("~/Admin/AccessDenied.aspx") End If ' (SignIn.ascx) If Request.IsAuthenticated = False And _portalSettings.ActiveTab.TabIndex = 0 Then LeftPane.Controls.Add(Page.LoadControl("~/DesktopModules/SignIn.ascx")) LeftPane.Visible = True End If ' XML , , , If _portalSettings.ActiveTab.Modules.Count > 0 Then Dim _moduleSettings As ModuleSettings For Each _moduleSettings In _portalSettings.ActiveTab.Modules Dim parent As Control = Page.FindControl(_moduleSettings.PaneName) ' user control instance, If _moduleSettings.CacheTime = 0 Then Dim portalModule As PortalModuleControl = CType(Page.LoadControl (_moduleSettings.DesktopSrc), PortalModuleControl) portalModule.PortalId = _portalSettings.PortalId portalModule.ModuleConfiguration = _moduleSettings parent.Controls.Add(portalModule) Else Dim portalModule As New CachedPortalModuleControl() portalModule.PortalId = _portalSettings.PortalId portalModule.ModuleConfiguration = _moduleSettings parent.Controls.Add(portalModule) End If ' parent.Controls.Add(New LiteralControl("<" + "br" + ">")) parent.Visible = True Next _moduleSettings End IfEnd Sub
楽しかった?
Portal Starter Kit英語版ソフトは、オリジナルコードを含む以下のURLから無料でダウンロードおよび使用できます:
http://www.asp.net/Default.aspx?tabindex=9&tabid=47
ASP.NET Starter Kit中国語版
ASP.NET Starter Kit中国語版ソフトは「MSDNダウンロード専用区」まで、分次無料ダウンロードと使用:
http://www.microsoft.com/taiwan/msdn/downloads/default.htm
またはMSDN Subscriptionを介して付属する.NETエンタープライズWebサイト錦嚢は、すべての中国語版エントリースイートとアーキテクチャホワイトペーパーを一度に取得します.関連項目:
http://www.microsoft.com/taiwan/msdn/promo/
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=165122