首先我们从一个链接请求到达服务器开始讲起,来找出系统是如何处理各种要求的,从而整理出来我们需要的各个组件。

       我们首先看看在 web.config 这个网站的配置文件当中,有下面一段配置。它意味着系统在处理连接请求时首先会通过下列过滤器插件的处理。

 

DNN 研究路线图 <httpModules>
DNN 研究路线图      
<add name="UrlRewrite" type="DotNetNuke.HttpModules.UrlRewriteModule, DotNetNuke.HttpModules.UrlRewrite" />
DNN 研究路线图      
<add name="Exception" type="DotNetNuke.HttpModules.ExceptionModule, DotNetNuke.HttpModules.Exception" />
DNN 研究路线图      
<!-- add name="Authentication" type="DotNetNuke.HttpModules.AuthenticationModule, DotNetNuke.HttpModules.Authentication" / -->
DNN 研究路线图      
<add name="UsersOnline" type="DotNetNuke.HttpModules.UsersOnlineModule, DotNetNuke.HttpModules.UsersOnline" />
DNN 研究路线图      
<add name="ProfilePrototype" type="Microsoft.ScalableHosting.Profile.ProfileModule, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />
DNN 研究路线图      
<add name="AnonymousIdentificationPrototype" type="Microsoft.ScalableHosting.Security.AnonymousIdentificationModule, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />
DNN 研究路线图      
<add name="RoleManagerPrototype" type="Microsoft.ScalableHosting.Security.RoleManagerModule, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562" />
DNN 研究路线图      
<add name="DNNMembership" type="DotNetNuke.HttpModules.DNNMembershipModule, DotNetNuke.HttpModules.DNNMembership" />
DNN 研究路线图      
<add name="Personalization" type="DotNetNuke.HttpModules.PersonalizationModule, DotNetNuke.HttpModules.Personalization" />
DNN 研究路线图    
</httpModules>

 

 

首先处理连接请求的是 UrlRewriteModule 这个过滤器处理模块。这个模块的处理功能是将 DotNetNuke 的链接形式转化为正常+ & 的模式(DNN的鼻祖IBuySpy)。但是在这个模块当中也封装了一些其他的处理。我们来看看HttpModule.UrlRewrite 的一些功能。这个项目当中主要的结构在后面章节描述。

HttpModule.UrlRewrite 当中主要入口模块或者主要控制程序是UrlRewriteModule.vb 当中的UrlRewriteModule 类。它继承了 IHttpModule。这个类需要实现 OnBeginRequest 这个 function , 用来处理提交到服务器的链接。

DNN 研究路线图Dim app As HttpApplication = CType(s, HttpApplication)
DNN 研究路线图            
Dim requestedPath As String = app.Request.Url.AbsoluteUri
DNN 研究路线图            
Dim Server As HttpServerUtility = app.Server
DNN 研究路线图            
Dim Request As HttpRequest = app.Request
DNN 研究路线图            
Dim Response As HttpResponse = app.Response
DNN 研究路线图
DNN 研究路线图            
' URL validation 
DNN 研究路线图
            ' check for ".." escape characters commonly used by hackers to traverse the folder tree on the server
DNN 研究路线图
            ' the application should always use the exact relative location of the resource it is requesting
DNN 研究路线图
            'Dim strURL As String = Server.UrlDecode(Request.RawUrl)
DNN 研究路线图
            Dim strURL As String = Request.Url.AbsolutePath
DNN 研究路线图            
Dim strDoubleDecodeURL As String = Server.UrlDecode(Server.UrlDecode(Request.RawUrl))
DNN 研究路线图            
If strURL.IndexOf(".."<> -1 Or strDoubleDecodeURL.IndexOf(".."<> -1 Then
DNN 研究路线图                
Throw New HttpException(404"Not Found")
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
'fix for ASP.NET canonicalization issues http://support.microsoft.com/?kbid=887459
DNN 研究路线图
            If (Request.Path.IndexOf(Chr(92)) >= 0 Or System.IO.Path.GetFullPath(Request.PhysicalPath) <> Request.PhysicalPath) Then
DNN 研究路线图                
Throw New HttpException(404"Not Found")
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
'check if we are upgrading/installing
DNN 研究路线图
            If Request.Url.LocalPath.ToLower.EndsWith("install.aspx"Then
DNN 研究路线图                
Exit Sub
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
' Remove querystring if exists.. it gets added on later
DNN 研究路线图
            If (app.Request.Url.Query <> ""Then
DNN 研究路线图                requestedPath 
= requestedPath.Replace(app.Request.Url.Query, "")
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            app.Context.Items.Add(
"UrlRewrite:OriginalUrl", app.Request.Url.AbsoluteUri)
DNN 研究路线图
DNN 研究路线图            
Dim rules As Config.RewriterRuleCollection = Config.RewriterConfiguration.GetConfig().Rules
DNN 研究路线图
DNN 研究路线图            
For i As Integer = 0 To rules.Count - 1
DNN 研究路线图                
Dim lookFor As String = "^" & RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, rules(i).LookFor) & "$"
DNN 研究路线图                
Dim re As Regex = New Regex(lookFor, RegexOptions.IgnoreCase)
DNN 研究路线图
DNN 研究路线图                
If (re.IsMatch(requestedPath)) Then
DNN 研究路线图                    
Dim sendTo As String = RewriterUtils.ResolveUrl(app.Context.Request.ApplicationPath, re.Replace(requestedPath, rules(i).SendTo))
DNN 研究路线图                    
Dim sesMatch As Match = re.Match(requestedPath)
DNN 研究路线图                    
Dim sesUrlParams As String = sesMatch.Groups(2).Value
DNN 研究路线图
DNN 研究路线图                    
If (sesUrlParams.Trim().Length > 0Then
DNN 研究路线图                        sesUrlParams 
= sesUrlParams.Replace("\""/")
DNN 研究路线图                        
Dim urlParams As String() = sesUrlParams.Split("/"c)
DNN 研究路线图
DNN 研究路线图                        
For x As Integer = 1 To urlParams.Length - 1
DNN 研究路线图                            
If (urlParams(x).Trim().Length > 0 And urlParams(x).ToLower <> glbDefaultPage.ToLower) Then
DNN 研究路线图                                sendTo 
= sendTo & "&" & urlParams(x).Replace(".aspx""").Trim() & "="
DNN 研究路线图                                
If (x < (urlParams.Length - 1)) Then
DNN 研究路线图                                    x 
+= 1
DNN 研究路线图                                    
If (urlParams(x).Trim <> ""Then
DNN 研究路线图                                        sendTo 
= sendTo & urlParams(x).Replace(".aspx""")
DNN 研究路线图                                    
End If
DNN 研究路线图                                
End If
DNN 研究路线图                            
End If
DNN 研究路线图                        
Next
DNN 研究路线图                    
End If
DNN 研究路线图                    RewriterUtils.RewriteUrl(app.Context, sendTo)
DNN 研究路线图                    
Exit For
DNN 研究路线图                
End If
DNN 研究路线图            
Next
DNN 研究路线图
DNN 研究路线图            
Dim TabId As Integer = -1
DNN 研究路线图            
Dim PortalId As Integer = -1
DNN 研究路线图            
Dim DomainName As String = Nothing
DNN 研究路线图            
Dim PortalAlias As String = Nothing
DNN 研究路线图            
Dim objPortalAliasInfo As PortalAliasInfo
DNN 研究路线图
DNN 研究路线图            
' get TabId from querystring ( this is mandatory for maintaining portal context for child portals )
DNN 研究路线图
            If Not (Request.QueryString("tabid"Is NothingThen
DNN 研究路线图                TabId 
= Int32.Parse(Request.QueryString("tabid"))
DNN 研究路线图            
End If
DNN 研究路线图            
' get PortalId from querystring ( this is used for host menu options as well as child portal navigation )
DNN 研究路线图
            If Not (Request.QueryString("portalid"Is NothingThen
DNN 研究路线图                PortalId 
= Int32.Parse(Request.QueryString("portalid"))
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
' alias parameter can be used to switch portals
DNN 研究路线图
            If Not (Request.QueryString("alias"Is NothingThen
DNN 研究路线图                
' check if the alias is valid
DNN 研究路线图
                If Not PortalSettings.GetPortalAliasInfo(Request.QueryString("alias")) Is Nothing Then
DNN 研究路线图                    
' check if the domain name contains the alias
DNN 研究路线图
                    If InStr(1, Request.QueryString("alias"), DomainName, CompareMethod.Text) = 0 Then
DNN 研究路线图                        
' redirect to the url defined in the alias
DNN 研究路线图
                        Response.Redirect(GetPortalDomainName(Request.QueryString("alias"), Request), True)
DNN 研究路线图                    
Else ' the alias is the same as the current domain
DNN 研究路线图
                        PortalAlias = Request.QueryString("alias")
DNN 研究路线图                    
End If
DNN 研究路线图                
End If
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
' parse the Request URL into a Domain Name token 
DNN 研究路线图
            DomainName = GetDomainName(Request)
DNN 研究路线图
DNN 研究路线图            
' PortalId identifies a portal when set
DNN 研究路线图
            If PortalAlias Is Nothing Then
DNN 研究路线图                
If PortalId <> -1 Then
DNN 研究路线图                    PortalAlias 
= PortalSettings.GetPortalByID(PortalId, DomainName)
DNN 研究路线图                
End If
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
' TabId uniquely identifies a Portal
DNN 研究路线图
            If PortalAlias Is Nothing Then
DNN 研究路线图                
If TabId <> -1 Then
DNN 研究路线图                    
' get the alias from the tabid, but only if it is for a tab in that domain
DNN 研究路线图
                    PortalAlias = PortalSettings.GetPortalByTab(TabId, DomainName)
DNN 研究路线图                    
If PortalAlias Is Nothing Or PortalAlias = "" Then
DNN 研究路线图                        
'if the TabId is not for the correct domain
DNN 研究路线图
                        'see if the correct domain can be found and redirect it 
DNN 研究路线图
                        objPortalAliasInfo = PortalSettings.GetPortalAliasInfo(DomainName)
DNN 研究路线图                        
If Not objPortalAliasInfo Is Nothing Then
DNN 研究路线图                            
If app.Request.Url.AbsoluteUri.ToLower.StartsWith("https://"Then
DNN 研究路线图                                strURL 
= "https://" & objPortalAliasInfo.HTTPAlias.Replace("*.""")
DNN 研究路线图                            
Else
DNN 研究路线图                                strURL 
= "http://" & objPortalAliasInfo.HTTPAlias.Replace("*.""")
DNN 研究路线图                            
End If
DNN 研究路线图                            
If strURL.ToLower.IndexOf(DomainName.ToLower()) = -1 Then
DNN 研究路线图                                strURL 
+= app.Request.Url.PathAndQuery
DNN 研究路线图                            
End If
DNN 研究路线图                            Response.Redirect(strURL, 
True)
DNN 研究路线图                        
End If
DNN 研究路线图                    
End If
DNN 研究路线图                
End If
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
' else use the domain name
DNN 研究路线图
            If PortalAlias Is Nothing Or PortalAlias = "" Then
DNN 研究路线图                PortalAlias 
= DomainName
DNN 研究路线图            
End If
DNN 研究路线图            
'using the DomainName above will find that alias that is the domainname portion of the Url
DNN 研究路线图
            'ie. dotnetnuke.com will be found even if zzz.dotnetnuke.com was entered on the Url
DNN 研究路线图
            objPortalAliasInfo = PortalSettings.GetPortalAliasInfo(PortalAlias)
DNN 研究路线图            
If Not objPortalAliasInfo Is Nothing Then
DNN 研究路线图                PortalId 
= objPortalAliasInfo.PortalID
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
' if the portalid is not known
DNN 研究路线图
            If PortalId = -1 Then
DNN 研究路线图                
If Not Request.Url.LocalPath.ToLower.EndsWith(glbDefaultPage.ToLower) Then
DNN 研究路线图                    
' allows requests for aspx pages in custom folder locations to be processed
DNN 研究路线图
                    Exit Sub
DNN 研究路线图                
Else
DNN 研究路线图                    
'the domain name was not found so try using the host portal's first alias
DNN 研究路线图
                    If Convert.ToString(HostSettings("HostPortalId")) <> "" Then
DNN 研究路线图                        PortalId 
= Convert.ToInt32(HostSettings("HostPortalId"))
DNN 研究路线图                        
' use the host portal
DNN 研究路线图
                        Dim objPortalAliasController As New PortalAliasController
DNN 研究路线图                        
Dim arrPortalAliases As ArrayList
DNN 研究路线图                        arrPortalAliases 
= objPortalAliasController.GetPortalAliasArrayByPortalID(Integer.Parse(Convert.ToString(HostSettings("HostPortalId"))))
DNN 研究路线图                        
If arrPortalAliases.Count > 0 Then
DNN 研究路线图                            
'Get the first Alias
DNN 研究路线图
                            objPortalAliasInfo = CType(arrPortalAliases(0), PortalAliasInfo)
DNN 研究路线图                            
If app.Request.Url.AbsoluteUri.ToLower.StartsWith("https://"Then
DNN 研究路线图                                strURL 
= "https://" & objPortalAliasInfo.HTTPAlias.Replace("*.""")
DNN 研究路线图                            
Else
DNN 研究路线图                                strURL 
= "http://" & objPortalAliasInfo.HTTPAlias.Replace("*.""")
DNN 研究路线图                            
End If
DNN 研究路线图                            
If TabId <> -1 Then
DNN 研究路线图                                strURL 
+= app.Request.Url.Query()
DNN 研究路线图                            
End If
DNN 研究路线图                            Response.Redirect(strURL, 
True)
DNN 研究路线图                        
End If
DNN 研究路线图                    
End If
DNN 研究路线图                
End If
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图
DNN 研究路线图            
If PortalId <> -1 Then
DNN 研究路线图                
' load the PortalSettings into current context
DNN 研究路线图
                Dim _portalSettings As PortalSettings = New PortalSettings(TabId, objPortalAliasInfo)
DNN 研究路线图                app.Context.Items.Add(
"PortalSettings", _portalSettings)
DNN 研究路线图            
Else
DNN 研究路线图                
' alias does not exist in database
DNN 研究路线图
                ' and all attempts to find another have failed
DNN 研究路线图
                'this should only happen if the HostPortal does not have any aliases
DNN 研究路线图
                Dim objStreamReader As StreamReader
DNN 研究路线图                objStreamReader 
= File.OpenText(Server.MapPath("~/404.htm"))
DNN 研究路线图                
Dim strHTML As String = objStreamReader.ReadToEnd
DNN 研究路线图                objStreamReader.Close()
DNN 研究路线图                strHTML 
= Replace(strHTML, "[DOMAINNAME]", DomainName)
DNN 研究路线图                Response.Write(strHTML)
DNN 研究路线图                Response.End()
DNN 研究路线图            
End If
DNN 研究路线图

这一节代码有些长,需要对它进行重构。这段代码实现的主要功能有:

1、  验证 URL 正确性。

a)         检查是否有..”这种字符的存在,防止非法访问服务器目录。

b)        修改 Asp.net 中的一个漏洞。http://support.microsoft.com/?kbid=887459

c)        检查系统是是否在安装状态,这个部分我们省略掉。

2、  定义重写规则,这个部分我们在第二部分予以详细讲解。

3、  读取项目信息。这个部分原本不应该出现在重写模块。

a)         读取 TabID

b)        读取PortalId

c)        读取别称参数。别称用在在不同的 Portals 之间转换。

d)        解析域名。主要用在 Ip 地址与域名绑定上。通过这个功能实现了一个站点对应多个域名的功能。

e)         通过 tabid 取得 Portal 信息

f)         通过域名定义别称

g)        通过别称取得Portal信息

h)        通过 Portal id 获得protal信息

i)          通过上述操作,获得 Portalid 后取得 Portal 的设置信息,并且将设置信息保存在上下文当中。

关于 Portal 相关类结构我们在后面的章节进一步描述。

RewriterUtils 工具重写了 URL 之后,所有的请求将被传递给系统几个主要的入口页面。在 Portal 当中可以接受普通计算机发送过来的请求,但是也可以接受手机等其他特殊设备发送过来的请求。目前我们主要处理的是从普通计算机发送过来的请求。需要我们注意的有两点,第一、所有请求都有单一的页面入口处理。第二、Portal 程序都是以控件安装到我们的系统当中。

        下面,我们来看看 Default.aspx 是如何处理页面链接请求的

  1DNN 研究路线图'
  2DNN 研究路线图' DotNetNuke?- http://www.dotnetnuke.com
  3DNN 研究路线图' Copyright (c) 2002-2006
  4DNN 研究路线图' by Perpetual Motion Interactive Systems Inc. ( http://www.perpetualmotion.ca )
  5DNN 研究路线图'
  6DNN 研究路线图' Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
  7DNN 研究路线图' documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
  8DNN 研究路线图' the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 
  9DNN 研究路线图' to permit persons to whom the Software is furnished to do so, subject to the following conditions:
 10DNN 研究路线图'
 11DNN 研究路线图' The above copyright notice and this permission notice shall be included in all copies or substantial portions 
 12DNN 研究路线图' of the Software.
 13DNN 研究路线图'
 14DNN 研究路线图' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
 15DNN 研究路线图' TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
 16DNN 研究路线图' THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
 17DNN 研究路线图' CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
 18DNN 研究路线图' DEALINGS IN THE SOFTWARE.
 19DNN 研究路线图'
 20DNN 研究路线图
 21DNN 研究路线图Imports System.IO
 22DNN 研究路线图Imports DotNetNuke.Entities.Tabs
 23DNN 研究路线图Imports DotNetNuke.UI.Skins
 24DNN 研究路线图
 25
 

        Default.aspx.vb 文件当中DefaultPage继承了DotNetNuke.Framework.CDefault 主要实现了三个页面事件,4 sub 和一个比较主要的 function , 调用顺序如下:

 

我们首先来讲一讲 Page_Init 这个事件。

1、  调用InitializePage 功能,主要处理下列事件:

a)      从上下文获取 PortalSettings

b)      根据 Tab name 重定向到特定的 tab

c)      如果是第一访问页面,那么重载数据避免被客户端缓存。

d)      设置 page title stylesheet

e)      检查是否要显示 Assembly 版本

f)      设置背景图片

g)      设置 META tags, copyright, keywords and description

2、  装载皮肤控件

a)      如果 cookie 中有记载,就根据 cookie 设置装载控件。

b)      如果被分配了皮肤控件,就装载指定的控件

c)      为活动页面设置皮肤路径

3、  将皮肤装载到页面当中。

4、  调用客户端 API

在这个类当中另外响应事件是 Page_PreRender,主要调用了 ManageRequest 方法。

这个方法主要实现了联合管理和网站访问记录,可以暂时忽略。

    在这段代码当中继续起主要作用的是 Skin 当中的控件装载。接下来我们分析一下Skin 类的装载功能。

    我们先分析一下 Page_Init 事件处理过程:

DNN 研究路线图 '
DNN 研究路线图
            ' CODEGEN: This call is required by the ASP.NET Web Form Designer.
DNN 研究路线图
            '
DNN 研究路线图
            InitializeComponent()
DNN 研究路线图
DNN 研究路线图            
Dim objModules As New ModuleController
DNN 研究路线图            
Dim objModule As ModuleInfo = Nothing
DNN 研究路线图            
Dim ctlPane As Control
DNN 研究路线图            
Dim blnLayoutMode As Boolean = Common.Globals.IsLayoutMode
DNN 研究路线图
DNN 研究路线图            
Dim bSuccess As Boolean = True
DNN 研究路线图            
' iterate page controls
DNN 研究路线图
            Dim ctlControl As Control
DNN 研究路线图            
Dim objHtmlControl As HtmlControl
DNN 研究路线图            
For Each ctlControl In Me.Controls
DNN 研究路线图                
' load the skin panes,TopPanel,LeftPanel,ContentPanel,RightPanel,BottomPanel
DNN 研究路线图
                If TypeOf ctlControl Is HtmlControl Then
DNN 研究路线图                    objHtmlControl 
= CType(ctlControl, HtmlControl)
DNN 研究路线图                    
If Not objHtmlControl.ID Is Nothing Then
DNN 研究路线图                        
Select Case objHtmlControl.TagName.ToUpper
DNN 研究路线图                            
Case "TD""DIV""SPAN""P"
DNN 研究路线图                                
' content pane
DNN 研究路线图
                                If ctlControl.ID <> "ControlPanel" Then
DNN 研究路线图                                    PortalSettings.ActiveTab.Panes.Add(ctlControl.ID)
DNN 研究路线图                                
End If
DNN 研究路线图                        
End Select
DNN 研究路线图                    
End If
DNN 研究路线图                
End If
DNN 研究路线图            
Next
DNN 研究路线图
DNN 研究路线图            
'if querystring dnnprintmode=true, controlpanel will not be shown
DNN 研究路线图
            If Request.QueryString("dnnprintmode"<> "true" Then
DNN 研究路线图                
' ControlPanel processing,如果是管理员角色则显示控制面板
DNN 研究路线图
                If (PortalSecurity.IsInRoles(PortalSettings.AdministratorRoleName.ToString) = True Or PortalSecurity.IsInRoles(PortalSettings.ActiveTab.AdministratorRoles.ToString) = TrueThen
DNN 研究路线图                    
Dim objControlPanel As UserControl = Nothing
DNN 研究路线图                    
If Convert.ToString(PortalSettings.HostSettings("ControlPanel")) <> "" Then
DNN 研究路线图                        
' load custom control panel
DNN 研究路线图
                        objControlPanel = CType(LoadControl("~/" & Convert.ToString(PortalSettings.HostSettings("ControlPanel"))), UserControl)
DNN 研究路线图                    
End If
DNN 研究路线图                    
If objControlPanel Is Nothing Then
DNN 研究路线图                        
' load default control panel
DNN 研究路线图
                        objControlPanel = CType(LoadControl("~/" & glbDefaultControlPanel), UserControl)
DNN 研究路线图                    
End If
DNN 研究路线图                    
' inject ControlPanel control into skin
DNN 研究路线图
                    ctlPane = Me.FindControl("ControlPanel")
DNN 研究路线图                    
If ctlPane Is Nothing Then
DNN 研究路线图                        
Dim objForm As HtmlForm = CType(Me.Parent.FindControl("Form"), HtmlForm)
DNN 研究路线图                        objForm.Controls.AddAt(
0, objControlPanel)
DNN 研究路线图                    
Else
DNN 研究路线图                        ctlPane.Controls.Add(objControlPanel)
DNN 研究路线图                    
End If
DNN 研究路线图                
End If
DNN 研究路线图            
End If
DNN 研究路线图            
DNN 研究路线图            
If Not IsAdminControl() Then    ' master module
DNN 研究路线图

DNN 研究路线图                
If PortalSecurity.IsInRoles(PortalSettings.ActiveTab.AuthorizedRoles) Then
DNN 研究路线图
DNN 研究路线图                    
' check portal expiry date
DNN 研究路线图
                    Dim blnExpired As Boolean = False
DNN 研究路线图                    
If PortalSettings.ExpiryDate <> Null.NullDate Then
DNN 研究路线图                        
If Convert.ToDateTime(PortalSettings.ExpiryDate) < Now() And PortalSettings.ActiveTab.ParentId <> PortalSettings.AdminTabId And PortalSettings.ActiveTab.ParentId <> PortalSettings.SuperTabId Then
DNN 研究路线图                            blnExpired 
= True
DNN 研究路线图                        
End If
DNN 研究路线图                    
End If
DNN 研究路线图                    
If Not blnExpired Then
DNN 研究路线图                        
If (PortalSettings.ActiveTab.StartDate < Now And PortalSettings.ActiveTab.EndDate > Now) Or blnLayoutMode = True Then
DNN 研究路线图                            
' process panes
DNN 研究路线图
                            If blnLayoutMode Then
DNN 研究路线图                                
Dim strPane As String
DNN 研究路线图                                
For Each strPane In PortalSettings.ActiveTab.Panes
DNN 研究路线图                                    ctlPane 
= Me.FindControl(strPane)
DNN 研究路线图                                    ctlPane.Visible 
= True
DNN 研究路线图
DNN 研究路线图                                    
' display pane border
DNN 研究路线图
                                    If TypeOf ctlPane Is HtmlContainerControl Then
DNN 研究路线图                                        
CType(ctlPane, HtmlContainerControl).Style("border-top"= "1px #CCCCCC dotted"
DNN 研究路线图                                        
CType(ctlPane, HtmlContainerControl).Style("border-bottom"= "1px #CCCCCC dotted"
DNN 研究路线图                                        
CType(ctlPane, HtmlContainerControl).Style("border-right"= "1px #CCCCCC dotted"
DNN 研究路线图                                        
CType(ctlPane, HtmlContainerControl).Style("border-left"= "1px #CCCCCC dotted"
DNN 研究路线图                                    
End If
DNN 研究路线图
DNN 研究路线图                                    
' display pane name
DNN 研究路线图
                                    Dim ctlLabel As New Label
DNN 研究路线图                                    ctlLabel.Text 
= "<center>" & strPane & "</center><br>"
DNN 研究路线图                                    ctlLabel.CssClass 
= "SubHead"
DNN 研究路线图                                    ctlPane.Controls.AddAt(
0, ctlLabel)
DNN 研究路线图                                
Next
DNN 研究路线图                            
End If
DNN 研究路线图
DNN 研究路线图                            
' dynamically populate the panes with modules
DNN 研究路线图
                            If PortalSettings.ActiveTab.Modules.Count > 0 Then
DNN 研究路线图
DNN 研究路线图                                
' loop through each entry in the configuration system for this tab
DNN 研究路线图
                                For Each objModule In PortalSettings.ActiveTab.Modules
DNN 研究路线图
DNN 研究路线图                                    
' if user is allowed to view module and module is not deleted
DNN 研究路线图
                                    If PortalSecurity.IsInRoles(objModule.AuthorizedViewRoles) = True And objModule.IsDeleted = False Then
DNN 研究路线图
DNN 研究路线图                                        
' if current date is within module display schedule or user is admin
DNN 研究路线图
                                        If (objModule.StartDate < Now And objModule.EndDate > Now) Or blnLayoutMode = True Then
DNN 研究路线图
DNN 研究路线图                                            
' modules which are displayed on all tabs should not be displayed on the Admin or Super tabs
DNN 研究路线图
                                            '如果模块不是在所有页面或超级页面显示
DNN 研究路线图
                                            If objModule.AllTabs = False Or PortalSettings.ActiveTab.IsAdminTab = False Then
DNN 研究路线图
DNN 研究路线图                                                
'查找模块的容器(TopPanel/LeftPanel/ContentPanel/..
DNN 研究路线图
                                                Dim parent As Control = Me.FindControl(objModule.PaneName)
DNN 研究路线图
DNN 研究路线图                                                
If parent Is Nothing Then
DNN 研究路线图                                                    
' the pane specified in the database does not exist for this skin
DNN 研究路线图
                                                    ' insert the module into the default pane instead
DNN 研究路线图
                                                    parent = Me.FindControl(glbDefaultPane)
DNN 研究路线图                                                
End If
DNN 研究路线图
DNN 研究路线图                                                
If Not parent Is Nothing Then
DNN 研究路线图                                                    
' try to localize admin modules
DNN 研究路线图
                                                    If PortalSettings.ActiveTab.IsAdminTab Then
DNN 研究路线图                                                        objModule.ModuleTitle 
= Services.Localization.Localization.LocalizeControlTitle(objModule.ModuleTitle, objModule.ControlSrc, "")
DNN 研究路线图                                                    
End If
DNN 研究路线图
DNN 研究路线图                                                    
'try to inject the module into the skin
DNN 研究路线图
                                                    '向模块内注入皮肤
DNN 研究路线图
                                                    Try
DNN 研究路线图                                                        InjectModule(parent, objModule, PortalSettings)
DNN 研究路线图                                                    
Catch ex As Exception
DNN 研究路线图                                                        bSuccess 
= False
DNN 研究路线图                                                    
End Try
DNN 研究路线图                                                
Else             ' no ContentPane in skin
DNN 研究路线图
                                                    Dim lex As ModuleLoadException
DNN 研究路线图                                                    lex 
= New ModuleLoadException(PANE_LOAD_ERROR)
DNN 研究路线图                                                    Controls.Add(
New ErrorContainer(PortalSettings, MODULELOAD_ERROR, lex).Container)
DNN 研究路线图                                                    LogException(lex)
DNN 研究路线图                                                    Err.Clear()
DNN 研究路线图                                                
End If
DNN 研究路线图
DNN 研究路线图                                            
End If
DNN 研究路线图
DNN 研究路线图                                        
End If
DNN 研究路线图
DNN 研究路线图                                    
End If
DNN 研究路线图                                
Next objModule
DNN 研究路线图                            
End If
DNN 研究路线图                        
Else
DNN 研究路线图                            Skin.AddPageMessage(
Me"", TABACCESS_ERROR, UI.Skins.Controls.ModuleMessage.ModuleMessageType.YellowWarning)
DNN 研究路线图                        
End If
DNN 研究路线图                    
Else
DNN 研究路线图                        Skin.AddPageMessage(
Me""String.Format(CONTRACTEXPIRED_ERROR, PortalSettings.PortalName, GetMediumDate(PortalSettings.ExpiryDate.ToString), PortalSettings.Email), UI.Skins.Controls.ModuleMessage.ModuleMessageType.RedError)
DNN 研究路线图                    
End If
DNN 研究路线图                
Else
DNN 研究路线图                    Response.Redirect(AccessDeniedURL(TABACCESS_ERROR), 
True)
DNN 研究路线图                
End If
DNN 研究路线图
DNN 研究路线图            
Else    ' slave module
DNN 研究路线图

DNN 研究路线图                
Dim ModuleId As Integer = -1
DNN 研究路线图                
Dim Key As String = ""
DNN 研究路线图
DNN 研究路线图                
' get ModuleId
DNN 研究路线图
                If Not IsNothing(Request.QueryString("mid")) Then
DNN 研究路线图                    ModuleId 
= Int32.Parse(Request.QueryString("mid"))
DNN 研究路线图                
End If
DNN 研究路线图
DNN 研究路线图                
' get ControlKey
DNN 研究路线图
                If Not IsNothing(Request.QueryString("ctl")) Then
DNN 研究路线图                    Key 
= Request.QueryString("ctl")
DNN 研究路线图                
End If
DNN 研究路线图
DNN 研究路线图                
' initialize moduleid for modulesettings
DNN 研究路线图
                If Not IsNothing(Request.QueryString("moduleid")) And (Key.ToLower = "module" Or Key.ToLower = "help"Then
DNN 研究路线图                    ModuleId 
= Int32.Parse(Request.QueryString("moduleid"))
DNN 研究路线图                
End If
DNN 研究路线图
DNN 研究路线图                
If ModuleId <> -1 Then
DNN 研究路线图                    
' get master module security settings
DNN 研究路线图
                    objModule = objModules.GetModule(ModuleId, PortalSettings.ActiveTab.TabID)
DNN 研究路线图                    
If Not objModule Is Nothing Then
DNN 研究路线图                        
If objModule.InheritViewPermissions Then
DNN 研究路线图                            objModule.AuthorizedViewRoles 
= PortalSettings.ActiveTab.AuthorizedRoles
DNN 研究路线图                        
End If
DNN 研究路线图                    
End If
DNN 研究路线图                
End If
DNN 研究路线图                
If objModule Is Nothing Then
DNN 研究路线图                    
' initialize object not related to a module
DNN 研究路线图
                    objModule = New ModuleInfo
DNN 研究路线图                    objModule.ModuleID 
= ModuleId
DNN 研究路线图                    objModule.ModuleDefID 
= -1
DNN 研究路线图                    objModule.TabID 
= PortalSettings.ActiveTab.TabID
DNN 研究路线图                    objModule.AuthorizedEditRoles 
= ""
DNN 研究路线图                    objModule.AuthorizedViewRoles 
= ""
DNN 研究路线图                
End If
DNN 研究路线图
DNN 研究路线图                
' initialize moduledefid for modulesettings
DNN 研究路线图
                If Not IsNothing(Request.QueryString("moduleid")) And (Key.ToLower = "module" Or Key.ToLower = "help"Then
DNN 研究路线图                    objModule.ModuleDefID 
= -1
DNN 研究路线图                
End If
DNN 研究路线图
DNN 研究路线图                
' override slave module settings
DNN 研究路线图
                If Request.QueryString("dnnprintmode"<> "true" Then
DNN 研究路线图                    objModule.ModuleTitle 
= ""
DNN 研究路线图                
End If
DNN 研究路线图                objModule.Header 
= ""
DNN 研究路线图                objModule.Footer 
= ""
DNN 研究路线图                objModule.StartDate 
= DateTime.MinValue
DNN 研究路线图                objModule.EndDate 
= DateTime.MaxValue
DNN 研究路线图                objModule.PaneName 
= glbDefaultPane
DNN 研究路线图                objModule.Visibility 
= VisibilityState.None
DNN 研究路线图                objModule.Color 
= ""
DNN 研究路线图                
If Request.QueryString("dnnprintmode"<> "true" Then
DNN 研究路线图                    objModule.Alignment 
= "center"
DNN 研究路线图                
End If
DNN 研究路线图                objModule.Border 
= ""
DNN 研究路线图                objModule.DisplayTitle 
= True
DNN 研究路线图                objModule.DisplayPrint 
= False
DNN 研究路线图                objModule.DisplaySyndicate 
= False
DNN 研究路线图
DNN 研究路线图                
' get portal container for slave module
DNN 研究路线图
                Dim objSkin As SkinInfo = SkinController.GetSkin(SkinInfo.RootContainer, PortalSettings.PortalId, SkinType.Portal)
DNN 研究路线图                
If Not objSkin Is Nothing Then
DNN 研究路线图                    objModule.ContainerSrc 
= objSkin.SkinSrc
DNN 研究路线图                
Else
DNN 研究路线图                    objModule.ContainerSrc 
= "[G]" & SkinInfo.RootContainer & glbDefaultContainerFolder & glbDefaultContainer
DNN 研究路线图                
End If
DNN 研究路线图                objModule.ContainerSrc 
= SkinController.FormatSkinSrc(objModule.ContainerSrc, PortalSettings)
DNN 研究路线图                objModule.ContainerPath 
= SkinController.FormatSkinPath(objModule.ContainerSrc)
DNN 研究路线图
DNN 研究路线图                
' get the pane
DNN 研究路线图
                Dim parent As Control = Me.FindControl(objModule.PaneName)
DNN 研究路线图
DNN 研究路线图                
' load the controls
DNN 研究路线图
                Dim objModuleControls As New ModuleControlController
DNN 研究路线图                
Dim objModuleControl As ModuleControlInfo
DNN 研究路线图                
Dim intCounter As Integer
DNN 研究路线图
DNN 研究路线图                
Dim arrModuleControls As ArrayList = objModuleControls.GetModuleControlsByKey(Key, objModule.ModuleDefID)
DNN 研究路线图
DNN 研究路线图                
For intCounter = 0 To arrModuleControls.Count - 1
DNN 研究路线图
DNN 研究路线图                    objModuleControl 
= CType(arrModuleControls(intCounter), ModuleControlInfo)
DNN 研究路线图
DNN 研究路线图                    
' initialize control values
DNN 研究路线图
                    objModule.ModuleControlId = objModuleControl.ModuleControlID
DNN 研究路线图                    objModule.ControlSrc 
= objModuleControl.ControlSrc
DNN 研究路线图                    objModule.ControlType 
= objModuleControl.ControlType
DNN 研究路线图                    objModule.IconFile 
= objModuleControl.IconFile
DNN 研究路线图                    objModule.HelpUrl 
= objModuleControl.HelpURL
DNN 研究路线图
DNN 研究路线图                    
If Not Null.IsNull(objModuleControl.ControlTitle) Then
DNN 研究路线图                        
' try to localize control title
DNN 研究路线图
                        objModule.ModuleTitle = Localization.LocalizeControlTitle(objModuleControl.ControlTitle, objModule.ControlSrc, Key)
DNN 研究路线图                    
End If
DNN 研究路线图
DNN 研究路线图                    
' verify that the current user has access to this control
DNN 研究路线图
                    Dim blnAuthorized As Boolean = True
DNN 研究路线图                    
Select Case objModule.ControlType
DNN 研究路线图                        
Case SecurityAccessLevel.Anonymous        ' anonymous
DNN 研究路线图
                        Case SecurityAccessLevel.View        ' view
DNN 研究路线图
                            If PortalSecurity.IsInRole(PortalSettings.AdministratorRoleName) = False And PortalSecurity.IsInRoles(PortalSettings.ActiveTab.AdministratorRoles.ToString) = False Then
DNN 研究路线图                                
If Not PortalSecurity.IsInRoles(objModule.AuthorizedViewRoles) Then
DNN 研究路线图                                    blnAuthorized 
= False
DNN 研究路线图                                
End If
DNN 研究路线图                            
End If
DNN 研究路线图                        
Case SecurityAccessLevel.Edit        ' edit
DNN 研究路线图
                            If PortalSecurity.IsInRole(PortalSettings.AdministratorRoleName) = False And PortalSecurity.IsInRoles(PortalSettings.ActiveTab.AdministratorRoles.ToString) = False Then
DNN 研究路线图                                
If Not PortalSecurity.IsInRoles(objModule.AuthorizedViewRoles) Then
DNN 研究路线图                                    blnAuthorized 
= False
DNN 研究路线图                                
Else
DNN 研究路线图                                    
If Not PortalSecurity.HasEditPermissions(objModule.ModulePermissions) Then
DNN 研究路线图                                        blnAuthorized 
= False
DNN 研究路线图                                    
End If
DNN 研究路线图                                
End If
DNN 研究路线图                            
End If
DNN 研究路线图                        
Case SecurityAccessLevel.Admin        ' admin
DNN 研究路线图
                            If PortalSecurity.IsInRole(PortalSettings.AdministratorRoleName) = False And PortalSecurity.IsInRoles(PortalSettings.ActiveTab.AdministratorRoles.ToString) = False Then
DNN 研究路线图                                blnAuthorized 
= False
DNN 研究路线图                            
End If
DNN 研究路线图                        
Case SecurityAccessLevel.Host        ' host
DNN 研究路线图
                            Dim objUserInfo As UserInfo = UserController.GetCurrentUserInfo
DNN 研究路线图                            
If Not objUserInfo.IsSuperUser Then
DNN 研究路线图                                blnAuthorized 
= False
DNN 研究路线图                            
End If
DNN 研究路线图                    
End Select
DNN 研究路线图
DNN 研究路线图                    
If blnAuthorized Then
DNN 研究路线图                        
'try to inject the module into the skin
DNN 研究路线图
                        Try
DNN 研究路线图                            InjectModule(parent, objModule, PortalSettings)
DNN 研究路线图                        
Catch ex As Exception
DNN 研究路线图                            bSuccess 
= False
DNN 研究路线图                        
End Try
DNN 研究路线图                    
Else
DNN 研究路线图                        Response.Redirect(AccessDeniedURL(MODULEACCESS_ERROR), 
True)
DNN 研究路线图                    
End If
DNN 研究路线图
DNN 研究路线图                
Next
DNN 研究路线图
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
If Not blnLayoutMode Then
DNN 研究路线图                CollapseUnusedPanes()
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
If Not Request.QueryString("error"Is Nothing Then
DNN 研究路线图                Skin.AddPageMessage(
Me, CRITICAL_ERROR, Server.HtmlEncode(Request.QueryString("error")), UI.Skins.Controls.ModuleMessage.ModuleMessageType.RedError)
DNN 研究路线图            
End If
DNN 研究路线图
DNN 研究路线图            
If Not (PortalSecurity.IsInRoles(PortalSettings.AdministratorRoleName) = True Or PortalSecurity.IsInRoles(PortalSettings.ActiveTab.AdministratorRoles.ToString) = TrueThen
DNN 研究路线图                
' only display the warning to non-administrators (adminsitrators will see the errors)
DNN 研究路线图
                If Not bSuccess Then
DNN 研究路线图                    Skin.AddPageMessage(
Me, MODULELOAD_WARNING, String.Format(MODULELOAD_WARNINGTEXT, PortalSettings.Email), UI.Skins.Controls.ModuleMessage.ModuleMessageType.YellowWarning)
DNN 研究路线图                
End If
DNN 研究路线图            
End If
 

1、InitializeComponent

2、迭代处理 Skin 界面当中所有的控件。因为在 Skin 界面当中会定义一些画板(画板-Pane,它分为5种画板类型TopPane,LeftPane,ContentPane,RightPane,BottomPane),并且将画板的 ID 记录在 PortalSettings.ActiveTab.Panes

3、判断是否是打印模式。如果是正常模式且有管理员权限需要显示 ControlPanel ,我们暂时不考虑这个部分

4、判断是否为主要处理模式

对于每个当前页面指定的模块找到相应的 Pane ,并且在装载 Title 时考虑全球化的问题

如果装载出错,处理页面异常。

5、判断是否为次要处理模式,主要为管理模块设置。

6、判断 blnLayoutMode 模式

在整个系统当中比较核心的一个方法是 InjectModule

这个函数在处理过程当中分为下面几个步骤:

1、装载容器

2、装载模块

Portal 信息类结构设计

Tab 类簇结构设计

HttpModule.UrlRewrite

Module 类簇设计

       Module 类簇设计是整个系统当中比较复杂的一个部分。它是 DotNetNuke 框架得以迅速扩展的基础。 Module 类簇主要包括下面几个部分:

1、  DesktopModule

 

2、  ModuleAction

 

3、   ModuleControl

 

4、  Module & ModuleSetting

相关文章: