前言:很早的时候就想创建一个自己的模块,但由于受英文资料的限制,所以一直都没有动手,趁国庆长假这段时间,狠下心,硬着头皮总算看完了那几个英文资料的文章。,看了N久总算对创建模块有了大概了解,不过到了刚动手的时候又不知道如何下手,结果又去翻那几篇英文资料,又重新看了好几遍,又对DotNetNuke自带的模块进行小部分的研究,总算有点了解,让我们看看如何创建我们自己的模块吧(这回我会详细将步骤都写下来,不过再深入的我也没有进行研究,请自行查看它的代码)在此也感谢 中国Rainbow
一,新建一个web application 应用程序项目,并将项目名称更为CnBlogs.FlashPlayer,并更改输出的程序集名称为:CnBlogs.FlashPlayer

二,添加引用DLL文件,DotNetNuke.dll,在数据库,自定义用户控件需要用到

三,为FlashPlayer新建用户控件(ASCX),名称为:FlashPlayer.ascx,EditFlashPlayer.ascx

为FlashPlayer.ascx放置一个label控件,并继承DotNetNuke.PortalModuleControl
Imports System.Text
Imports DotNetNuke
Namespace CnBlogsNamespace CnBlogs.FlashPlayer
Public Class FlashPlayerClass FlashPlayer
Inherits DotNetNuke.PortalModuleControl
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
End Sub
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
'注意: 以下占位符声明是 Web 窗体设计器所必需的。
'不要删除或移动它。
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
End Sub
End Class
End Namespace
FlashPlayer.vb
Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
If Not IsPostBack Then
Try
Dim swfFile As String = CType(Settings("movie"), String) 'flash文件
If Not (swfFile Is Nothing) And swfFile <> "" Then
Dim StringFormat As StringBuilder = New StringBuilder("<object classid=""clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"" ")
StringFormat.Append("codebase=""http://download.macromedia.com/pub/sho ... h/swflash.cab#version=6,0,29,0"" width={0} height={1}>")
StringFormat.Append(" <param name=""movie"" value={2}>")
StringFormat.Append(" <param name=""quality"" value=""high"">")
StringFormat.Append(" <embed src={3} quality=""high"" ")
StringFormat.Append(" pluginspage=""http://www.macromedia.com/go/getflashplayer"" type=""applic ... ;></embed></object>")
Label1.Text = String.Format(StringFormat.ToString, CType(Settings("width"), String), CType(Settings("height"), String), swfFile, swfFile)
End If
Catch exc As Exception 'Module failed to load
ProcessModuleLoadException(Me, exc)
End Try
End If
End Sub
也许大家会有疑问:Settings("movie") 是从哪里来的?它的数据又是从哪里来的?
刚开始研究模块的创建我也有同样的疑问,而且造成这个疑问主要是因为DotNetNuke自带的模块都是为它们模块独立创建一张表,比如Links模块,它的表的名称就是:DNN_links,而造成这个问题也主要还是我对DNN的许多地方都没有研究过,后来在查看DotNetNuke.PortalModuleControl 对它也有了我妥
DotNetNuke的DesktopControls.vb 代码
Imports System
Imports System.Configuration
Imports System.Data
Imports System.IO
Namespace DotNetNukeNamespace CnBlogs.FlashPlayer
Public Class PortalModuleControlClass PortalModuleControl
Inherits UserControl
……
……
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public ReadOnly Property Settings()Property Settings() As Hashtable
Get
If _settings Is Nothing Then
_settings = PortalSettings.GetModuleSettings(ModuleId)
End If
Return _settings
End Get
End Property
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public ReadOnly Property PortalSettings()Property PortalSettings() As PortalSettings
Get
PortalSettings = CType(HttpContext.Current.Items("PortalSettings"), PortalSettings)
End Get
End Property
End Class
End Namespace
上面的HttpContext.Current.Items("PortalSettings")是从global.vb 的Application_BeginRequest事件获得,它在整个网站的运行起到了模块分析,及其它数据的存储,也是核心的部分。它是分析url,将当页的所有模块信息都载入保存进来,请大家自已对这块内容研究,我好像在以前的随笔也有对这个进行简单的介绍
EditFlashPlayer.ascx
该控件主要是配置作用,比如SWF地址,高度(height),长度(width)……

EditFlashPlayer.ascx.vb
Namespace DotNetNukeNamespace DotNetNuke
Public Class EditFlashPlayerClass EditFlashPlayer
Inherits DotNetNuke.PortalModuleControl
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
End Sub
Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
Protected WithEvents txturl As System.Web.UI.WebControls.TextBox
Protected WithEvents txtwidth As System.Web.UI.WebControls.TextBox
Protected WithEvents txtheight As System.Web.UI.WebControls.TextBox
'注意: 以下占位符声明是 Web 窗体设计器所必需的。
'不要删除或移动它。
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
Try
If Not IsPostBack = True Then
If ModuleId <> -1 Then '
Dim settings As Hashtable
' Get settings from the database
settings = PortalSettings.GetModuleSettings(ModuleId)
txtUrl.text = CType(settings("movie"), String)
txtWidth.Text = CType(settings("width"), String)
txtHeight.Text = CType(settings("height"), String)
End If
End If
Catch ex As Exception
End Try
End Sub
Private Sub LinkButton1_Click()Sub LinkButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
Dim objModules As New ModuleController
objModules.UpdateModuleSetting(ModuleId, "movie", txturl.Text)
objModules.UpdateModuleSetting(ModuleId, "width", txtwidth.Text)
objModules.UpdateModuleSetting(ModuleId, "height", txtheight.Text)
End Sub
End Class
End Namespace
Public Sub UpdateModuleSetting()Sub UpdateModuleSetting(ByVal ModuleId As Integer, ByVal SettingName As String, ByVal SettingValue As String)
Dim dr As IDataReader = DataProvider.Instance().GetModuleSetting(ModuleId, SettingName)
If dr.Read Then
DataProvider.Instance().UpdateModuleSetting(ModuleId, SettingName, SettingValue)
Else
DataProvider.Instance().AddModuleSetting(ModuleId, SettingName, SettingValue)
End If
dr.Close()
End Sub全部好了之后对编译,接下去的工作就是上传模块了,在上传模块之前我们需要配置一个文件。建立一个flashplayer.dnn文件。然后以host用户登陆后就可以上传模块了
在第一次编写模块,发现将模块添加到页面上时会显示不出菜单,结果昨天晚上花了很长时间都没有解决。后来在中国Rainbow 的帮助下才找到问题的所在。
flashplayer.vb
Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
MyBase.Actions.Add(GetNextActionID, "Options", "", URL:=EditURL(, , "Options"), secure:=SecurityAccessLevel.Edit, Visible:=True)
End Sub
我看别人的代码有个毛病,从来会忘记page_init里的代码:( 看来以后要注意下自己的习惯了

后续:刚开始没有做过模块总以为创建模块是一件很困难的事,而且也没有中文资料,看了一些英文资料之后有无从下手的感觉。做这个模块我实际上做了三次,前二次做到一半就有疑问,下一步应该怎么走?我也无从得之,只好又删了文件又在重新看资料。还有一次就是刚建立了项目就不知道下手了:(
现在,自己在回头看看,实际上创建一个模块非常简单,因为DotNetNuke为你封装了许多方法,比如数据库的读取数据,更新数据等……国庆长假之后我可能对DotNetNuke的研究会少许多时间了,有可能都会没有精力再研究了
模块下载:https://files.cnblogs.com/zc_net/FlashPlayer.zip
参考资料:
Creating a new DotNetNuke module in Visual Basic
DotNetNuke Module:DNN MP3 Player :)
扩展AdRotator控件,让它支持.SWF广告 (源码)
DotNetNuke:Package a new Module
一,新建一个web application 应用程序项目,并将项目名称更为CnBlogs.FlashPlayer,并更改输出的程序集名称为:CnBlogs.FlashPlayer

二,添加引用DLL文件,DotNetNuke.dll,在数据库,自定义用户控件需要用到

三,为FlashPlayer新建用户控件(ASCX),名称为:FlashPlayer.ascx,EditFlashPlayer.ascx

为FlashPlayer.ascx放置一个label控件,并继承DotNetNuke.PortalModuleControl
Imports System.Text
Imports DotNetNuke
Namespace CnBlogsNamespace CnBlogs.FlashPlayer
Public Class FlashPlayerClass FlashPlayer
Inherits DotNetNuke.PortalModuleControl
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
End Sub
Protected WithEvents Label1 As System.Web.UI.WebControls.Label
'注意: 以下占位符声明是 Web 窗体设计器所必需的。
'不要删除或移动它。
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
End Sub
End Class
End Namespace
FlashPlayer.vb
Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
If Not IsPostBack Then
Try
Dim swfFile As String = CType(Settings("movie"), String) 'flash文件
If Not (swfFile Is Nothing) And swfFile <> "" Then
Dim StringFormat As StringBuilder = New StringBuilder("<object classid=""clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"" ")
StringFormat.Append("codebase=""http://download.macromedia.com/pub/sho ... h/swflash.cab#version=6,0,29,0"" width={0} height={1}>")
StringFormat.Append(" <param name=""movie"" value={2}>")
StringFormat.Append(" <param name=""quality"" value=""high"">")
StringFormat.Append(" <embed src={3} quality=""high"" ")
StringFormat.Append(" pluginspage=""http://www.macromedia.com/go/getflashplayer"" type=""applic ... ;></embed></object>")
Label1.Text = String.Format(StringFormat.ToString, CType(Settings("width"), String), CType(Settings("height"), String), swfFile, swfFile)
End If
Catch exc As Exception 'Module failed to load
ProcessModuleLoadException(Me, exc)
End Try
End If
End Sub
也许大家会有疑问:Settings("movie") 是从哪里来的?它的数据又是从哪里来的?
刚开始研究模块的创建我也有同样的疑问,而且造成这个疑问主要是因为DotNetNuke自带的模块都是为它们模块独立创建一张表,比如Links模块,它的表的名称就是:DNN_links,而造成这个问题也主要还是我对DNN的许多地方都没有研究过,后来在查看DotNetNuke.PortalModuleControl 对它也有了我妥
DotNetNuke的DesktopControls.vb 代码
Imports System
Imports System.Configuration
Imports System.Data
Imports System.IO
Namespace DotNetNukeNamespace CnBlogs.FlashPlayer
Public Class PortalModuleControlClass PortalModuleControl
Inherits UserControl
……
……
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public ReadOnly Property Settings()Property Settings() As Hashtable
Get
If _settings Is Nothing Then
_settings = PortalSettings.GetModuleSettings(ModuleId)
End If
Return _settings
End Get
End Property
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public ReadOnly Property PortalSettings()Property PortalSettings() As PortalSettings
Get
PortalSettings = CType(HttpContext.Current.Items("PortalSettings"), PortalSettings)
End Get
End Property
End Class
End Namespace
上面的HttpContext.Current.Items("PortalSettings")是从global.vb 的Application_BeginRequest事件获得,它在整个网站的运行起到了模块分析,及其它数据的存储,也是核心的部分。它是分析url,将当页的所有模块信息都载入保存进来,请大家自已对这块内容研究,我好像在以前的随笔也有对这个进行简单的介绍
EditFlashPlayer.ascx
该控件主要是配置作用,比如SWF地址,高度(height),长度(width)……

EditFlashPlayer.ascx.vb
Namespace DotNetNukeNamespace DotNetNuke
Public Class EditFlashPlayerClass EditFlashPlayer
Inherits DotNetNuke.PortalModuleControl
#Region " Web 窗体设计器生成的代码 "
'该调用是 Web 窗体设计器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
End Sub
Protected WithEvents LinkButton1 As System.Web.UI.WebControls.LinkButton
Protected WithEvents txturl As System.Web.UI.WebControls.TextBox
Protected WithEvents txtwidth As System.Web.UI.WebControls.TextBox
Protected WithEvents txtheight As System.Web.UI.WebControls.TextBox
'注意: 以下占位符声明是 Web 窗体设计器所必需的。
'不要删除或移动它。
Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load()Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
Try
If Not IsPostBack = True Then
If ModuleId <> -1 Then '
Dim settings As Hashtable
' Get settings from the database
settings = PortalSettings.GetModuleSettings(ModuleId)
txtUrl.text = CType(settings("movie"), String)
txtWidth.Text = CType(settings("width"), String)
txtHeight.Text = CType(settings("height"), String)
End If
End If
Catch ex As Exception
End Try
End Sub
Private Sub LinkButton1_Click()Sub LinkButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
Dim objModules As New ModuleController
objModules.UpdateModuleSetting(ModuleId, "movie", txturl.Text)
objModules.UpdateModuleSetting(ModuleId, "width", txtwidth.Text)
objModules.UpdateModuleSetting(ModuleId, "height", txtheight.Text)
End Sub
End Class
End Namespace
Public Sub UpdateModuleSetting()Sub UpdateModuleSetting(ByVal ModuleId As Integer, ByVal SettingName As String, ByVal SettingValue As String)
Dim dr As IDataReader = DataProvider.Instance().GetModuleSetting(ModuleId, SettingName)
If dr.Read Then
DataProvider.Instance().UpdateModuleSetting(ModuleId, SettingName, SettingValue)
Else
DataProvider.Instance().AddModuleSetting(ModuleId, SettingName, SettingValue)
End If
dr.Close()
End Sub全部好了之后对编译,接下去的工作就是上传模块了,在上传模块之前我们需要配置一个文件。建立一个flashplayer.dnn文件。然后以host用户登陆后就可以上传模块了
在第一次编写模块,发现将模块添加到页面上时会显示不出菜单,结果昨天晚上花了很长时间都没有解决。后来在中国Rainbow 的帮助下才找到问题的所在。
flashplayer.vb
Private Sub Page_Init()Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
'不要使用代码编辑器修改它。
InitializeComponent()
MyBase.Actions.Add(GetNextActionID, "Options", "", URL:=EditURL(, , "Options"), secure:=SecurityAccessLevel.Edit, Visible:=True)
End Sub
我看别人的代码有个毛病,从来会忘记page_init里的代码:( 看来以后要注意下自己的习惯了

后续:刚开始没有做过模块总以为创建模块是一件很困难的事,而且也没有中文资料,看了一些英文资料之后有无从下手的感觉。做这个模块我实际上做了三次,前二次做到一半就有疑问,下一步应该怎么走?我也无从得之,只好又删了文件又在重新看资料。还有一次就是刚建立了项目就不知道下手了:(
现在,自己在回头看看,实际上创建一个模块非常简单,因为DotNetNuke为你封装了许多方法,比如数据库的读取数据,更新数据等……国庆长假之后我可能对DotNetNuke的研究会少许多时间了,有可能都会没有精力再研究了
模块下载:https://files.cnblogs.com/zc_net/FlashPlayer.zip
参考资料:
Creating a new DotNetNuke module in Visual Basic
DotNetNuke Module:DNN MP3 Player :)
扩展AdRotator控件,让它支持.SWF广告 (源码)
DotNetNuke:Package a new Module
浙公网安备 33010602011771号