转自:http://www.apsky.cn/article.asp?id=353
这篇随笔对SKIN.VB的分析可能比较简单,但具体的流程我应该是写出来了,对于它的具体作用还是需要大家自己的分析里面的代码,毕竟我也是自己研究,对一些地方的看法也有或多或少存在错误。
一,获取当前请求的httpcontext的入口设置
Dim _portalSettings As PortalSettings
=
CType(HttpContext.Current.Items(
"
PortalSettings
"
), PortalSettings)
二,获取模块标题为:Site Settings 的ID(存储过程GetSiteMode()),然后根据该ID获取DNN的容器
三,遍历HTML窗体的服务器控件(Me.Controls,注释:定义所有asp.net服务器控件共享的属性,方法和事件)如果它的类型是HTMLCONTROL(TypeOf ctlControl Is HtmlControl)(注释:HTML服务器控件的所通用的方法,属性和事件),进行转换,并断定它是否包含“runation
=
server“的属性值及对应值,只在到_portalSettings的Panes哈期表中
For Each ctlControl In Me.Controls
'
load the skin panes
'
载入皮肤容器
If TypeOf ctlControl Is HtmlControl Then
objHtmlControl
=
CType(ctlControl, HtmlControl)
If Not objHtmlControl.ID Is Nothing Then
Select Case objHtmlControl.TagName.ToUpper
'
leftpane,contentpane,rightpane
Case
"
TD
"
,
"
DIV
"
,
"
SPAN
"
,
"
P
"
'
content pane
'
窗器位置
_portalSettings.Panes.Add(ctlControl.ID)
End Select
End If
End If
Next
四,根据URL的参数判断是否是管理控制,如果是,重申admin.ascx控件,并处理panes
panes:如果当我们以管理员登陆,并且这个位置是可以显示边框(位置的AuthorizedRoles=
-
1
)及名称的,比如默认有Home位置,它的AuthorizedRoles=”
-
1
;
0
”,就相应的显示边框,并显示panen名称(leftpane,rightpane,contextpane)
If (PortalSecurity.IsInRole(_portalSettings.AdministratorRoleId.ToString)
=
True Or PortalSecurity.IsInRoles(_portalSettings.ActiveTab.AdministratorRoles.ToString)
=
True) And blnPreview
=
False Then
'
是以管理登陆,并且它是可以显示边框(-1) 及pane名称的,比如home,skin位置等
If IsAdminTab(_portalSettings.ActiveTab.TabId, _portalSettings.ActiveTab.ParentId)
=
False Then
blnLayoutMode
=
True
End If
End If
显示边框及名称
If blnLayoutMode Then
'
???管理,并且它是否是独立
Dim ctlPane As Control
Dim strPane As String
For Each strPane In _portalSettings.Panes
'
_portalSettings.Panes=rightpant,contentpant,rightpane
ctlPane
=
Me.FindControl(strPane)
ctlPane.Visible
=
True
'
display pane border
'
显示pane的边框
If TypeOf ctlPane Is HtmlTableCell Then
CType(ctlPane, HtmlTableCell).Style(
"
border-top
"
)
=
"
1px #CCCCCC dotted
"
CType(ctlPane, HtmlTableCell).Style(
"
border-bottom
"
)
=
"
1px #CCCCCC dotted
"
CType(ctlPane, HtmlTableCell).Style(
"
border-right
"
)
=
"
1px #CCCCCC dotted
"
CType(ctlPane, HtmlTableCell).Style(
"
border-left
"
)
=
"
1px #CCCCCC dotted
"
End If
'
display pane name
'
显示pane的名称,如leftpane,contentpane,rightpane
Dim ctlLabel As New Label
ctlLabel.Text
=
"
<center>
"
&
strPane
&
"
</center><br>
"
ctlLabel.CssClass
=
"
SubHead
"
ctlPane.Controls.AddAt(
0
, ctlLabel)
Next
End If点击游览效果图:http:
//
www.cnblogs.com/images/cnblogs_com/zc_net/dnn_17.gif
五,从数据库中(DNN_Modules)获取不当前位置的所有模块信息(
/
dotnetnuke
/
default
.aspx
?
tabid
=
1
),根据每个模块的的位置(panename),载入到相应的位置当中(panename)
'
inject the module into the skin
InjectModule(parent, _moduleSettings, _portalSettings) InjectModule事件的简要的流程:
第一步:先载入容器(~
/
portal
/
_default
/
containers
/
_default
/
default
.ascx) ctlContainer
=
LoadContainer(
"
~
"
&
ModuleSettings.ContainerPath.Remove(
0
, Len(Global.ApplicationPath))
&
ModuleSettings.ContainerSrc, objPane)第二步:获取窗口的表格(pane),然后在表格中载入模块
'
get container pane
Dim objCell As Control
=
ctlContainer.FindControl(glbDefaultPane)
'
glbDefaultPane="contentpane"
'
create a wrapper panel control for the module content min/max
Dim objPanel As New Panel
objPanel.ID
=
"
ModuleContent
"
'
module user control processing
'
模块用户控制处理
If Not objPortalModuleControl Is Nothing Then
'
inject the module into the panel
'
objPanel=模块容器
objPanel.Controls.Add(objPortalModuleControl)
End If
'
inject the panel into the container pane
'
注入面板插入到容器窗框中
objCell.Controls.Add(objPanel)
第三步:在指定位置(leftpane,contentpane,rightpane)载入创建的表格
'
inject the container into the page pane - this triggers the Pre_Init() event for the user control
objPane.Controls.Add(ctlContainer)
六:分析URL的地址,从数据库中的表中分析相应模块及说明,然后又执行上面的(五)步骤
Dim ModuleId As Integer
=
-
1
Dim Key As String
=
""
'
get ModuleId(获取模块ID)
If Not IsNothing(Request.QueryString(
"
mid
"
)) Then
ModuleId
=
Int32.Parse(Request.QueryString(
"
mid
"
))
End If
'
get Key(获得关键字),动态进行装载控件
If Not IsNothing(Request.QueryString(
"
def
"
)) Then
Key
=
Request.QueryString(
"
def
"
)
'
old syntax
End If
If Not IsNothing(Request.QueryString(
"
ctl
"
)) Then
Key
=
Request.QueryString(
"
ctl
"
)
'
new syntax
End If
Dim arrModuleControls As ArrayList
=
objModuleControls.GetModuleControlsByKey(Key, _moduleSettings.ModuleDefId)
For intCounter
=
0
To arrModuleControls.Count
-
1
……这里执行存储过程GetModuleControlsByKey,返回列表(也就是模块信息)
next
If blnAuthorized Then
'
inject the module
InjectModule(parent, _moduleSettings, _portalSettings)
Else
Skin.AddPageMessage(Me,
""
,
"
Either you are not currently logged in, or you do not have the rights to access this module within the portal.
"
, Skins.ModuleMessage.ModuleMessageType.YellowWarning)
End If