创建 DotNetNuke® 模块 -完全面向初学者!






4.69/5 (43投票s)
如何使用 Visual Studio Express 创建 DotNetNuke® 模块 -
引言
本文详细介绍了创建 DotNetNuke 模块的过程。
要求
要使用本教程,您需要
- Visual Studio Express (在此下载)
- SQL Server Express (在此下载)
- DotNetNuke Starter Kit 4.x (在此下载)
注意:下载时,文件扩展名可能会更改为“.zip”。下载后,请将其更改为“.vsi”,然后双击该文件即可安装模板。
注意:请勿在生产环境的 DotNetNuke 安装中尝试创建模块;相信我,您一定会搞乱安装,最终不得不恢复数据库或重新安装。
安装
- 如果尚未安装 Visual Studio Express,请安装它 (在此下载)。
- 如果尚未安装 SQL Server Express,请安装它 (在此下载)。
- 请按照此处的说明安装 DotNetNuke Starter Kit 并创建 DotNetNuke 网站。
非常重要:在“解决方案资源管理器”窗口中单击根目录一次。这样做可以确保入门模块代码被创建在正确的位置。
从工具栏选择 **文件**,然后选择 **新建文件**
在下一个菜单中,单击 **DotNetNuke Module**(位于“我的模板”下),从“语言”下拉列表中选择“Visual Basic”,在“名称”框中键入“GuestBook”。,然后单击 **添加**。
本教程在此打断,插入一条重要警告
注意:如果在“ModuleName”目录中的文件 DataProvider.vb、GuestBookController.vb、GuestBookInfo.vb 和 SqlDataProvider.vb 位于“DesktopModules/App_Code”下,则说明它们的位置不正确。
单击“ModuleName”文件夹,将其拖放到网站主根目录正下方的“App_Code”目录中。您还需要移动“DesktopModules/ModuleName”文件夹,并将“ModuleName”文件夹拖放到网站主根目录正下方的“DesktopModules”文件夹中。
这是其应有的正确外观
| |
现在回到教程
一个非常有用的帮助页面会弹出,指示您将 /App_Code/ModuleName 重命名为 /App_Code/GuestBook,并将 /DesktopModules/ModuleName 重命名为 /DesktopModules/GuestBook。
通过在“解决方案资源管理器”中右键单击文件夹名称并从菜单中选择“重命名”来执行更改。您需要执行两次。一次是针对“App_Code”下的文件夹,另一次是针对“DesktopModules”下的文件夹。
| |
现在,从工具栏中,选择 **生成**,然后选择 **生成网站**
网站应该可以无错误地生成。
在“解决方案资源管理器”中,右键单击“Default.aspx”并选择 **设为启动页**
从工具栏中,选择 **调试**,然后选择 **不进行调试启动**。
(您可能想知道为什么我没有讲调试。在创建本教程时,我在自己的机器上遇到了权限问题。这些问题很容易解决,但我想避免任何不必要的复杂性。如果您需要调试帮助,请参阅此帖。)
网站现在应该会打开。
点击 **登录**
以“host
”身份登录。密码(如果您尚未更改)是“dnnhost
”
点击 **HOST** 菜单并选择 **SQL**。
表单将显示。
切换回 **Visual Studio**,在 **解决方案资源管理器** 中。双击“DestopModules/GuestBook”目录下的“01.00.00.SqlDataProvider
”,使其在主窗口中显示。
单击页面一次,然后从工具栏中,选择 **编辑**,然后选择 **全选** (Ctrl +A)。
然后 **编辑**,然后 **复制** (Ctrl +C)。
切换回 DotNetNuke 网站,将您复制的脚本粘贴 (Ctrl +V) 到窗口中,勾选“作为脚本运行”框,然后单击 **执行**。
从 **HOST** 菜单中,选择“模块定义”。
单击 **模块定义** 菜单左上角的小向下箭头,然后选择“创建新模块”。
在“模块清单”下拉列表中选择“GuestBook.dnn”,然后单击“安装”。
在 **页面功能** 菜单下,单击 **添加**
在 **页面详细信息** 菜单中
- 在“页面名称”中输入“Guest Book”。
- 在“页面标题”中输入“Guest Book”。
- 在“描述”中输入“Guest Book”。
- 勾选“查看页面”框,该框位于“所有用户”旁边。
然后,单击 **更新**
从“模块”下拉列表中,选择“GuestBook”
然后,单击 **添加**
如果您遇到“对象引用未设置为对象的实例
”错误,只需单击“Guest Book”链接即可。
(但是,如果您在低于 Pentium III 且内存小于 512 KB 的机器上运行 DotNetNuke,则 DotNetNuke 将经常抛出此错误。)
模块现在应该出现了
访客留言簿模块
我们将分以下几个步骤来介绍访客留言簿模块的构建
- 数据访问层 (DAL) - 我们将创建表、存储过程,并修改“SqlDataProvider.vb”和“DataProvider.vb”文件中的代码。
- 业务逻辑层 (BLL) - 我们将修改“GuestBookController.vb”和“GuestBookInfo.vb”文件中的代码。
- 表示层 (UI) - 我们将修改“ViewGuestBook.ascx”以及“DesktopModules/GuestBook”目录中的其他文件中的代码。
数据访问层 (DAL)
要构建数据访问层,我们将
- 创建表.
- 创建存储过程.
- 修改 SqlDataProvider.vb 文件。将调用存储过程的代码放入“SqlDataProvider.vb”文件中。
- 修改 DataProvider.vb 文件。将(被“SqlDataProvider.vb”文件覆盖的)方法放入“DataProvider.vb”文件中。
就这样!实际上,添加到“SqlDataProvider.vb”和“DataProvider.vb”文件中的代码并不多。创建表和存储过程是标准的数据库编程,您可能已经很熟悉了。
来源:“DotNetNuke 模块开发人员指南”
版权所有 © 2003-2005 Perpetual Motion Interactive Systems, Inc. 保留所有权利。
连接到数据库
如果您使用 SQL Server 2005 Express 创建了 DotNetNuke 网站,您的数据库连接应该已经为您设置好了。如果您使用 SQL Server 2000 或 SQL Server 2005 设置的,则可能需要进行设置。
要设置到 SQL Server 数据库的连接,请从工具栏选择 **视图**,然后选择 **服务器资源管理器**。
在 **服务器资源管理器** 中,右键单击 **数据连接**,然后选择“添加连接”
填写连接信息,然后单击 **确定**。
删除示例数据库对象
现在您需要删除模板创建的表和存储过程,以便您可以创建新的表和存储过程(恰好使用相同的名称)供留言簿使用。
连接现在应该会显示在服务器资源管理器中。单击连接旁边的加号将其展开。接下来,单击 **表** 旁边的加号图标将其展开。
右键单击表“YourCompany_GuestBook
”,选择“删除”,然后删除该表。
注意:此时,该模块将不再能在您的 DotNetNuke 网站中工作。在您完成本教程的所有步骤之前,它将无法再次工作。
单击 **存储过程** 旁边的加号图标将其展开。一次一个地右键单击以下存储过程并选择“删除”以删除它们。请记住,您必须逐个删除它们。
YourCompany_AddGuestBook
YourCompany_DeleteGuestBook
YourCompany_GetGuestBook
YourCompany_GetGuestBooks
YourCompany_UpdateGuestBook
创建表
以 Host 身份登录 DotNetNuke 网站(如果您尚未登录 Host),然后从Host 菜单中选择 **SQL**。
将以下脚本粘贴到框中
CREATE TABLE [dbo].[YourCompany_GuestBook](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ModuleID] [int] NULL,
[Name] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Email] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Message] [nvarchar](250) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[DateEntered] [datetime] NULL,
CONSTRAINT [PK_YourCompany_GuestBook] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
不要勾选“作为脚本运行”框,然后单击 **执行**。
(注意:这是一个 SQL 2005 脚本。它不适用于 SQL 2000。对于 SQL 2000,您需要手动创建表,如接下来的两步中所述。)
可选地,您可以在 Visual Web Developer 的表设计器中创建表。在 **服务器资源管理器** 中,右键单击 **表**,然后选择 **添加新表**
使用下图在表设计器中设计表。将“ID”列设为“标识”列,并将其设为主键。将其保存为“YourCompany_GuestBook
”。
创建存储过程
以 Host 身份登录 DotNetNuke 网站(如果您尚未登录 Host),然后从Host 菜单中选择 **SQL**。
将以下脚本粘贴到框中
CREATE PROCEDURE {databaseOwner}
[{objectQualifier}YourCompany_GuestBook_Delete]
(
@ID int
)
AS
DELETE FROM {objectQualifier}YourCompany_GuestBook
WHERE (ID = @ID)
RETURN
GO
CREATE PROCEDURE {databaseOwner}
[{objectQualifier}YourCompany_GuestBook_GetAll]
(
@ModuleID int
)
AS
SELECT ID, ModuleID, Name, Email, Message, DateEntered
FROM {objectQualifier}YourCompany_GuestBook
WHERE (ModuleID = @ModuleID)
order by DateEntered DESC
RETURN
GO
CREATE PROCEDURE {databaseOwner}
[{objectQualifier}YourCompany_GuestBook_Insert]
(
@ModuleID int,
@Name nvarchar(50),
@Email nvarchar(50),
@Message nvarchar(250)
)
AS
INSERT INTO {objectQualifier}YourCompany_GuestBook
(ModuleID, Name, Email, Message, DateEntered)
VALUES (@ModuleID,@Name,@Email,@Message,getdate())
RETURN
GO
CREATE PROCEDURE {databaseOwner}
[{objectQualifier}YourCompany_GuestBook_Update]
(
@ID int,
@Name nvarchar(50),
@Email nvarchar(50),
@Message nvarchar(250),
@DateEntered datetime
)
AS
UPDATE {objectQualifier}YourCompany_GuestBook
SET Name = @Name, Email = @Email,
Message = @Message, DateEntered = @DateEntered
WHERE (ID = @ID)
RETURN
GO
勾选 **作为脚本运行** 框,然后单击 **执行**
验证存储过程是否已创建。切换回 Visual Studio,然后从工具栏选择 **视图** 和 **服务器资源管理器**
在“服务器资源管理器”窗口中,右键单击 **存储过程**,然后选择 **刷新**
向下滚动存储过程列表,并验证这些存储过程是否已创建
YourCompany_GuestBook_Delete
YourCompany_GuestBook_GetAll
YourCompany_GuestBook_Insert
YourCompany_GuestBook_Update
修改“SqlDataProvider.vb”文件。在 Visual Studio 中,从工具栏选择 **视图** 和“解决方案资源管理器”
在“解决方案资源管理器”窗口中,展开“App_code”文件夹下的“GuestBook”目录,然后双击“SqlDataprovider.vb”文件
将所有代码替换为
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.ApplicationBlocks.Data
Imports DotNetNuke.Common.Utilities
Imports DotNetNuke.Framework.Providers
Namespace YourCompany.Modules.GuestBook
Public Class SqlDataProvider Inherits DataProvider
Private Const ProviderType As String = "data"
Private Const ModuleQualifier As String = ""
Private _providerConfiguration As _
ProviderConfiguration = _
ProviderConfiguration.GetProviderConfiguration(ProviderType)
Private _connectionString As String
Private _providerPath As String
Private _objectQualifier As String
Private _databaseOwner As String
' <summary>
' Constructs new SqlDataProvider instance
' </summary>
Public Sub New()
MyBase.New()
'Read the configuration specific information for this provider
Dim objProvider As Provider = CType(_providerConfiguration._
Providers(_providerConfiguration.DefaultProvider), Provider)
'Read the attributes for this provider
If ((objProvider.Attributes("connectionStringName") <> "") _
AndAlso (System.Configuration.ConfigurationManager._
AppSettings(objProvider.Attributes(_
"connectionStringName")) <> "")) Then
connectionString = System.Configuration._
ConfigurationManager.AppSettings(_
objProvider.Attributes("connectionStringName"))
Else
_connectionString = _
objProvider.Attributes("connectionString")
End If
_providerPath = objProvider.Attributes("providerPath")
_objectQualifier = objProvider.Attributes("objectQualifier")
If ((_objectQualifier <> "") _
AndAlso (_objectQualifier.EndsWith("_") _
= False)) Then
_objectQualifier = (_objectQualifier + "_")
End If
_databaseOwner = objProvider.Attributes("databaseOwner")
If ((_databaseOwner <> "") _
AndAlso (_databaseOwner.EndsWith(_
".") = False)) Then
_databaseOwner = (_databaseOwner + ".")
End If
End Sub
' <summary>
' Gets and sets the connection string
' </summary>
Public ReadOnly Property ConnectionString() As String
Get
Return _connectionString
End Get
End Property
' <summary>
' Gets and sets the Provider path
' </summary>
Public ReadOnly Property ProviderPath() As String
Get
Return _providerPath
End Get
End Property
' <summary>
' Gets and sets the Object qualifier
' </summary>
Public ReadOnly Property ObjectQualifier() As String
Get
Return _objectQualifier
End Get
End Property
' <summary>
' Gets and sets the database owner
' </summary>
Public ReadOnly Property DatabaseOwner() As String
Get
Return _databaseOwner
End Get
End Property
' --------------------------------------------------
' <summary>
' Gets the fully qualified name
' of the stored procedure
' </summary>
' <param name="name">The name
' of the stored procedure</param>
' <returns>The fully qualified name</returns>
' --------------------------------------------------
Private Function GetFullyQualifiedName(ByVal _
name As String) As String
Return (DatabaseOwner _
+ (ObjectQualifier _
+ (ModuleQualifier + name)))
End Function
' --------------------------------------------------
' <summary>
' Gets the value for the field or DbNull
' if field has "null" value
' </summary>
' <param name="Field">The field to evaluate</param>
' <returns></returns>
' --------------------------------------------------
Private Function GetNull(ByVal Field As Object) As Object
Return Null.GetNull(Field, DBNull.Value)
End Function
Public Overrides Sub YourCompany_GuestBook_Insert(ByVal _
ModuleId As Integer, ByVal Name As String, _
ByVal Email As String, ByVal Message As String)
SqlHelper.ExecuteNonQuery(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_Insert"), _
ModuleId, Name, Email, Message)
End Sub
Public Overrides Sub _
YourCompany_GuestBook_Delete(ByVal ID As Integer)
SqlHelper.ExecuteNonQuery(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_Delete"), ID)
End Sub
Public Overrides Function YourCompany_GuestBook_GetAll _
(ByVal ModuleId As Integer) As IDataReader
Return CType(SqlHelper.ExecuteReader(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_GetAll"), _
ModuleId), IDataReader)
End Function
Public Overrides Sub YourCompany_GuestBook_Update(ByVal ID _
As Integer, ByVal Name As String, ByVal Email As _
String, ByVal Message As String, _
ByVal DateEntered As DateTime)
SqlHelper.ExecuteNonQuery(ConnectionString, _
GetFullyQualifiedName("YourCompany_GuestBook_Update"), _
ID, Name, Email, Message, DateEntered)
End Sub
End Class
End Namespace
您会注意到会出现类似以下的错误
"'YourCompany_GuestBook_Insert' cannot be declared
'Overrides' because it does not override a sub in a base class"
这是因为“DataProvider.vb”必须指示“SqlDataProvider.vb”覆盖的方法。当我们将在“DataProvider.vb”文件中放置这些方法时,错误就会消失。
修改“DataProvider.vb”文件。在“解决方案资源管理器”中,在“App_code”文件夹下的“GuestBook”目录中,双击“DataProvider.vb”文件。
将所有代码替换为
Imports System
Imports DotNetNuke
Imports System.Data
Imports DotNetNuke.Framework
Namespace YourCompany.Modules.GuestBook
Public MustInherit Class DataProvider
' singleton reference to the instantiated object
Private Shared objProvider As DataProvider = Nothing
' constructor
Shared Sub New()
CreateProvider()
End Sub
' dynamically create provider
Private Shared Sub CreateProvider()
objProvider = CType(Reflection.CreateObject("data", _
"YourCompany.Modules.GuestBook", _
""), DataProvider)
End Sub
' return the provider
Public Shared Function Instance() As DataProvider
Return objProvider
End Function
Public MustOverride Sub YourCompany_GuestBook_Insert(ByVal _
ModuleId As Integer, ByVal Name As String, _
ByVal Email As String, ByVal Message As String)
Public MustOverride Function _
YourCompany_GuestBook_GetAll(ByVal ModuleId _
As Integer) As IDataReader
Public MustOverride Sub YourCompany_GuestBook_Update(ByVal _
ID As Integer, ByVal Name As String, _
ByVal Email As String, ByVal Message _
As String, ByVal DateEntered As DateTime)
Public MustOverride Sub _
YourCompany_GuestBook_Delete(ByVal ID As Integer)
End Class
End Namespace
切换回“SqlDataprovider.vb”文件,并注意所有错误消息都已消失。现在是保存(Ctrl+Shift+S)的好时机。
评估
- 数据访问层 (DAL) (完成)
- 业务逻辑层 (BLL)
- 表示层 (UI)
我们已经完成了数据访问层。现在我们将编程业务逻辑层。业务逻辑层将很快完成,因为它只有两个文件:一个简单的类文件来保存我们的数据,以及一个“控制器”文件,它将用数据填充类文件,并处理插入和删除数据。
业务逻辑层 (BLL)
要构建业务逻辑层,我们将
- 修改“GuestBookInfo.vb”
- 修改“GuestBookController.vb”
就这样!这是初学者通常最难理解但实际上并不复杂的步骤。但是,ASP.NET 2.0 相比 ASP.NET 1.1 版本大大减少了代码量。
修改“GuestBookInfo.vb”文件
在 Visual Studio 中,从工具栏选择 **视图**,然后选择“解决方案资源管理器”
在“解决方案资源管理器”窗口中,展开“App_code”文件夹下的“GuestBook”目录,然后双击“GuestBookInfo.vb”文件
将文件中的每一行代码替换为这段代码
Imports System
Imports System.Configuration
Imports System.Data
Namespace YourCompany.Modules.GuestBook
Public Class GuestBookInfo
Private _ModuleId As Integer
Private _ID As Integer
Private _Name As String
Private _Email As String
Private _Message As String
Private _DateEntered As DateTime
' initialization
Public Sub New()
MyBase.New()
End Sub
' <summary>
' Gets and sets the Module Id
' </summary>
Public Property ModuleId() As Integer
Get
Return _ModuleId
End Get
Set(ByVal value As Integer)
_ModuleId = value
End Set
End Property
' <summary>
' Gets and sets the Item ID
' </summary>
Public Property ID() As Integer
Get
Return _ID
End Get
Set(ByVal value As Integer)
_ID = value
End Set
End Property
' <summary>
' gets and sets the Name
' </summary>
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
' <summary>
' Gets and sets the Email
' </summary>
Public Property Email() As String
Get
Return _Email
End Get
Set(ByVal value As String)
_Email = value
End Set
End Property
' <summary>
' Gets and sets the Message
' </summary>
Public Property Message() As String
Get
Return _Message
End Get
Set(ByVal value As String)
_Message = value
End Set
End Property
' <summary>
' Gets and sets the DateEntered
' </summary>
Public Property DateEntered() As DateTime
Get
Return _DateEntered
End Get
Set(ByVal value As DateTime)
_DateEntered = value
End Set
End Property
End Class
End Namespace
修改“GuestBookController.vb”文件
在 Visual Studio 中,从工具栏选择 **视图**,然后选择“解决方案资源管理器”。
在“解决方案资源管理器”窗口中,展开“App_code”文件夹下的“GuestBook”目录,然后双击“GuestBookController.vb”文件
将文件中的每一行代码替换为这段代码
Imports System
Imports System.Collections.Generic
Imports System.Configuration
Imports System.ComponentModel
Imports System.Data
Imports System.Xml
Imports System.Web
Imports DotNetNuke
Imports DotNetNuke.Common
Imports DotNetNuke.Common.Utilities
Imports DotNetNuke.Entities.Modules
Imports DotNetNuke.Services.Search
Namespace YourCompany.Modules.GuestBook
Public Class GuestBookController
<DataObjectMethod(DataObjectMethodType.Insert)> _
Public Shared Sub GuestBook_Insert(_
ByVal objTest As GuestBookInfo)
DataProvider.Instance.YourCompany_GuestBook_Insert(_
objTest.ModuleId, objTest.Name, _
objTest.Email, objTest.Message)
End Sub
<DataObjectMethod(DataObjectMethodType.Delete)> _
Public Shared Sub GuestBook_Delete(ByVal _
objTest As GuestBookInfo)
DataProvider.Instance._
YourCompany_GuestBook_Delete(objTest.ID)
End Sub
<DataObjectMethod(DataObjectMethodType.Select)> _
Public Shared Function GuestBook_GetAll(_
ByVal ModuleId As Integer) _
As List(Of GuestBookInfo)
Return CBO.FillCollection(Of GuestBookInfo)_
(DataProvider.Instance()._
YourCompany_GuestBook_GetAll(ModuleId))
End Function
<DataObjectMethod(DataObjectMethodType.Update)> _
Public Shared Sub GuestBook_Update(ByVal _
objTest As GuestBookInfo)
DataProvider.Instance._
YourCompany_GuestBook_Update(objTest.ID, _
objTest.Name, objTest.Email, _
objTest.Message, objTest.DateEntered)
End Sub
End Class
End Namespace
评估
- 数据访问层 (DAL) (完成)
- 业务逻辑层 (BLL) (完成)
- 表示层 (UI)
我们已经完成了业务逻辑层。
我们刚刚做了什么?
创建了“GuestBookInfo.vb”。这只是一个简单的类文件。它将保存数据。
创建了“GuestBookController.vb”。这个类有四个方法
GuestBook_Insert
- 将项目插入数据库。您将一个“
GuestBookInfo
”对象传递给此方法。然后,该方法打开对象并将单个参数(模块 ID、姓名、电子邮件、消息)传递给 DataProvider.vb 文件中的“YourCompany_GuestBook_Insert
”方法。
- 将项目插入数据库。您将一个“
GuestBook_Delete
- 从数据库删除项目。您将一个“
GuestBookInfo
”对象传递给此方法。然后,该方法打开对象并将单个参数(ID)传递给 DataProvider.vb 文件中的“YourCompany_GuestBook_Delete
”方法。
- 从数据库删除项目。您将一个“
GuestBook_GetAll
- 获取数据库的记录集。您将一个“
ModuleId
”参数传递给此方法。该方法调用 DataProvider.vb 文件中的“YourCompany_GuestBook_GetAll
”方法,并返回一个填充了数据的“GuestBookInfo
”对象。
- 获取数据库的记录集。您将一个“
GuestBook_Update
- 更新数据库。您将一个“
GuestBookInfo
”对象传递给此方法。然后,该方法打开对象并将单个参数(ID、模块 ID、姓名、电子邮件、消息、输入日期)传递给 DataProvider.vb 文件中的“YourCompany_GuestBook_Update
”方法。
- 更新数据库。您将一个“
许多内容已被删除
您可能会注意到“GuestBookController.vb”文件中删除了很多代码。其中一些是可选接口,用于处理数据导出和搜索。这些是您需要阅读和在模块中实现的接口。但是,它们不是必需的,为了简单起见,已被省略。
通过使用仅适用于 ASP.NET 2.0 且与 ASP.NET 1.1 不兼容的代码,消除了大量代码。ASP.NET 2.0 确实为您节省了大量工作,并且需要更少的代码。
表示层 (UI)
从这一点开始,需要修改的文件位于“.../DesktopModules/GuestBook”目录中。
要构建表示层,我们将
- 修改“本地化”(.resx)文件。
- 修改“控件”及其“代码隐藏”文件
- EditGuestBook.ascx
- Settings.ascx
- ViewGuestBook.ascx
就这样!模块将完成。
修改本地化文件
本地化允许您创建标签,这些标签可以通过简单地更改具有“.resx”扩展名的“资源”文件来更改其文本(例如,将文本从英语更改为西班牙语)。
双击“EditGuestBook.ascx.resx”以打开它。
将内容更改为与下图匹配。顺序无关紧要。完成后保存并关闭文件。
双击“Settings.ascx.resx”以打开它。
将内容更改为与下图匹配。顺序无关紧要。完成后保存并关闭文件。
双击“ViewGuestBook.ascx.resx”以打开它。
将内容更改为与下图匹配。顺序无关紧要。完成后保存并关闭文件。
修改控件
模块包含三个控件(及其“代码隐藏”文件)
- EditGuestBook.ascx
- EditGuestBook.ascx.vb
- Settings.ascx
- Settings.ascx.vb
- ViewGuestBook.ascx
- ViewGuestBook.ascx.vb
(来自本教程早期步骤中在 DotNetNuke 网站中创建的模块定义的屏幕截图。)
右键单击“EditGuestBook.ascx”并选择“查看标记”
将所有代码替换为这段代码(完成后保存并关闭文件)
<%@ Control language="VB"
Inherits="YourCompany.Modules.GuestBook.EditGuestBook"
CodeFile="EditGuestBook.ascx.vb"
AutoEventWireup="true"%>
<%@ Register TagPrefix="dnn" TagName="Label"
Src="~/controls/LabelControl.ascx" %>
<dnn:label id="lblContent" runat="server"
controlname="lblContent" suffix=":">
</dnn:label>
<asp:ObjectDataSource ID="ObjectDataSource_Tasks"
runat="server"
DataObjectTypeName="YourCompany.Modules.
GuestBook.GuestBookInfo"
DeleteMethod="GuestBook_Delete"
InsertMethod="GuestBook_Insert"
OldValuesParameterFormatString="original_{0}"
OnInit="Page_Load" SelectMethod="GuestBook_GetAll"
TypeName="YourCompany.Modules.GuestBook.GuestBookController"
UpdateMethod="GuestBook_Update">
<SelectParameters>
<asp:Parameter DefaultValue="00" Name="ModuleId" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:GridView ID="GridView1" runat="server"
AllowPaging="True" AutoGenerateColumns="False"
DataSourceID="ObjectDataSource_Tasks"
DataKeyNames="ID">
<Columns>
<asp:CommandField ShowDeleteButton="True"
ShowEditButton="True" />
<asp:BoundField DataField="ID"
HeaderText="ID" Visible="False" />
<asp:BoundField DataField="ModuleID"
HeaderText="ModuleID" Visible="False" />
<asp:BoundField DataField="Name"
HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Message"
HeaderText="Message" SortExpression="Message" />
<asp:BoundField DataField="Email" HeaderText="Email" />
<asp:BoundField ApplyFormatInEditMode="True"
DataField="DateEntered" DataFormatString="{0:d}"
HeaderText="Date" HtmlEncode="False"
SortExpression="DateEntered" />
</Columns>
</asp:GridView>
右键单击“Settings.ascx”并选择“查看标记”
将所有代码替换为这段代码(完成后保存并关闭文件)
<%@ Control Language="VB" AutoEventWireup="false"
CodeFile="Settings.ascx.vb"
Inherits="YourCompany.Modules.GuestBook.Settings" %>
<%@ Register TagPrefix="dnn" TagName="Label"
Src="~/controls/LabelControl.ascx" %>
<dnn:label id="lblshowform" runat="server"
controlname="txtshowform" suffix=":">
</dnn:label>
<br />
<asp:DropDownList ID="DropDownList1" runat="server"
AutoPostBack="True"
nSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Selected="True">Yes</asp:ListItem>
<asp:ListItem>No</asp:ListItem>
</asp:DropDownList>
右键单击“ViewGuestBook.ascx”并选择“查看标记”
将所有代码替换为这段代码(完成后保存并关闭文件)
<%@ Control Language="VB"
Inherits="YourCompany.Modules.GuestBook.ViewGuestBook"
CodeFile="ViewGuestBook.ascx.vb"
AutoEventWireup="true" %>
<%@ Register TagPrefix="dnn" TagName="Label"
Src="~/controls/LabelControl.ascx" %>
<asp:ObjectDataSource ID="ObjectDataSource_Tasks"
runat="server"
DataObjectTypeName="YourCompany.Modules.
GuestBook.GuestBookInfo"
DeleteMethod="GuestBook_Delete"
InsertMethod="GuestBook_Insert"
OldValuesParameterFormatString="original_{0}"
SelectMethod="GuestBook_GetAll"
TypeName="YourCompany.Modules.
GuestBook.GuestBookController"
UpdateMethod="GuestBook_Update"
OnInit="Page_Load">
<SelectParameters>
<asp:Parameter DefaultValue="00"
Name="ModuleId" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:GridView ID="GridView1" runat="server"
DataSourceID="ObjectDataSource_Tasks"
AutoGenerateColumns="False"
AllowPaging="True" HorizontalAlign="Center">
<Columns>
<asp:BoundField DataField="Name"
HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Message"
HeaderText="Message"
SortExpression="Message" />
<asp:BoundField ApplyFormatInEditMode="True"
DataField="DateEntered" DataFormatString="{0:d}"
HeaderText="Date"
SortExpression="DateEntered"
HtmlEncode="False" />
</Columns>
<EmptyDataTemplate>
There are no entries.
</EmptyDataTemplate>
</asp:GridView>
<br />
<center>
<dnn:Label ID="lblAddMessage" runat="server"
ControlName="lblAddMessage" Suffix=":">
</dnn:Label>
</center>
<br />
<asp:FormView ID="FormView1" runat="server"
DataSourceID="ObjectDataSource_Tasks"
DefaultMode="Insert" HorizontalAlign="Center">
<InsertItemTemplate>
<table cellpadding="2" cellspacing="5"
style="width: 50%" align="center">
<tr>
<td align="right" style="width: 4px">
<asp:Label ID="Label1"
runat="server" Text="Name"></asp:Label></td>
<td style="width: 100px">
<asp:TextBox ID="NameTextBox" runat="server"
Text='<%# Bind("Name") %>'
Width="264px"></asp:TextBox></td>
</tr>
<tr>
<td align="right" style="width: 4px; height: 23px">
<asp:Label ID="Label3" runat="server"
Text="Email"></asp:Label></td>
<td style="width: 100px; height: 23px">
<asp:TextBox ID="EmailTextBox" runat="server"
Text='<%# Bind("Email") %>'
Width="264px"></asp:TextBox></td>
</tr>
<tr>
<td align="right" style="width: 4px; height: 21px">
<asp:Label ID="Label2" runat="server"
Text="Message"></asp:Label></td>
<td style="width: 100px; height: 21px">
<asp:TextBox ID="MessageTextBox"
runat="server" EnableViewState="False"
MaxLength="250" Rows="2"
Text='<%# Bind("Message") %>'
TextMode="MultiLine"
Width="264px"></asp:TextBox></td>
</tr>
<tr>
<td align="right" colspan="2" style="height: 21px">
<asp:Button ID="InsertButton" runat="server"
Text="Submit" CommandName="Insert" /></td>
</tr>
</table>
<br />
</InsertItemTemplate>
</asp:FormView>
右键单击“EditGuestBook.ascx”并选择“查看代码”
将所有代码替换为这段代码(完成后保存并关闭文件。)
Imports DotNetNuke
Imports System.Web.UI
Imports System.Collections.Generic
Imports System.Reflection
Imports DotNetNuke.Entities.Modules
Namespace YourCompany.Modules.GuestBook
Partial Class EditGuestBook Inherits PortalModuleBase
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs)
Try
Catch exc As Exception
Exceptions.ProcessModuleLoadException(Me, exc)
End Try
End Sub
Protected Sub SetModuleId(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls._
ObjectDataSourceSelectingEventArgs) _
Handles ObjectDataSource_Tasks.Selecting
e.InputParameters("ModuleId") = ModuleId.ToString
End Sub
End Class
End Namespace
右键单击“Settings.ascx”并选择“查看代码”
将所有代码替换为这段代码(完成后保存并关闭文件)
Imports System
Imports System.Web.UI
Imports DotNetNuke
Imports DotNetNuke.Entities.Modules
Imports DotNetNuke.Services.Exceptions
Namespace YourCompany.Modules.GuestBook
Partial Class Settings Inherits ModuleSettingsBase
Public Overrides Sub LoadSettings()
Try
If (Page.IsPostBack = False) Then
If (Not (CType(TabModuleSettings(_
"showform"), _
String)) Is Nothing) Then
Me.DropDownList1.SelectedValue_
= CType(TabModuleSettings(_
"showform"), String)
End If
End If
Catch exc As Exception
Exceptions.ProcessModuleLoadException(Me, exc)
End Try
End Sub
Protected Sub DropDownList1_SelectedIndexChanged(ByVal_
sender As Object, ByVal e As EventArgs)
Dim objModules As ModuleController = _
New ModuleController
If (Me.DropDownList1.SelectedValue = "Yes") Then
objModules.UpdateTabModuleSetting(_
TabModuleId, "showform", "Yes")
Else
objModules.UpdateTabModuleSetting(_
TabModuleId, "showform", "No")
End If
End Sub
End Class
End Namespace
右键单击“ViewGuestBook.ascx”并选择“查看代码”
将所有代码替换为这段代码(完成后保存并关闭文件)
Imports DotNetNuke
Imports System.Web.UI
Imports System.Collections.Generic
Imports System.Reflection
Imports DotNetNuke.Entities.Modules
Namespace YourCompany.Modules.GuestBook
Partial Class ViewGuestBook
Inherits Entities.Modules.PortalModuleBase
Implements Entities.Modules.IActionable
Public ReadOnly Property ModuleActions() _
As Entities.Modules.Actions._
ModuleActionCollection Implements _
Entities.Modules.IActionable.ModuleActions
Get
Dim Actions As New Entities.Modules_
.Actions.ModuleActionCollection
Actions.Add(GetNextActionID, _
Localization.GetString(_
Entities.Modules.Actions._
ModuleActionType.EditContent, _
LocalResourceFile), _
Entities.Modules.Actions._
ModuleActionType.EditContent, _
"", "", EditUrl(), False, _
Security.SecurityAccessLevel.Edit,_
True, False)
Return Actions
End Get
End Property
Protected Sub Page_Load(ByVal sender _
As Object, ByVal e As System.EventArgs)
Try
Dim objModules As ModuleController_
= New ModuleController
If Not Page.IsPostBack Then
If (Not (CType(Settings("showform"), _
String)) Is Nothing) Then
If (CType(Settings("showform"), _
String) = "No") Then
' Do not allow messages to be added
FormView1.Visible = False
lblAddMessage.Visible = False
End If
End If
Else
Me.GridView1.DataBind()
End If
Catch ex As Exception
Exceptions.ProcessModuleLoadException(Me, ex)
End Try
End Sub
Protected Sub NewItem(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls._
FormViewInsertEventArgs) _
Handles FormView1.ItemInserting
e.Values.Item("ID") = 0
e.Values.Item("ModuleId") = ModuleId.ToString()
e.Values.Item("DateEntered") = _
DateTime.Now.ToShortDateString
End Sub
Protected Sub SetModuleID(ByVal sender As _
Object, ByVal e As System.Web.UI._
WebControls.ObjectDataSourceSelectingEventArgs) _
Handles ObjectDataSource_Tasks.Selecting
e.InputParameters("ModuleId") = ModuleId.ToString
End Sub
End Class
End Namespace
评估
- 数据访问层 (DAL) (完成)
- 业务逻辑层 (BLL) (完成)
- 表示层 (UI) (完成)
构建网站
从工具栏中,选择生成,然后选择“生成网站”
网站应该可以无错误地生成
从工具栏中,选择 **调试**,然后选择 **不进行调试启动**
网站将打开。单击菜单栏上的“Guest Book”
模块现在将显示
历史
- 2007 年 1 月 21 日:初始版本