为绝对初学者创建一个超快、超简单的 DotNetNuke® 模块!






4.93/5 (18投票s)
本教程将向您展示如何使用新的 DAL+(DotNetNuke 数据访问层的扩展功能集)来创建 DotNetNuke 模块。
引言
假设您的老板刚刚交给您一项任务,为运行 DotNetNuke 的公司内部网创建一个“交易站”类型的模块。过去,您可能需要花费将近半小时来设置开发环境,以及花费数小时来创建数据访问层 (DAL) 和代码。
随着 DotNetNuke 和 DAL 的最新增强功能,DAL+ 的创建已经改变了这一切。
本教程将向您展示如何使用新的 DAL+(DotNetNuke 数据访问层 (DAL) 的扩展功能集)来创建 DotNetNuke 模块。
您将需要什么
要使用本教程,您需要
- Visual Studio Express (下载)
- SQL Server Express (下载)
- DotNetNuke Starter Kit 4.x (下载) (注意:下载时,文件扩展名可能会变为“.zip”。下载后,将其更改为“.vsi”,然后双击该文件即可安装模板。)
模块
本教程的目标是展示 DotNetNuke 模块开发现在是如何变得超快速、超简单的。示例模块仅包含四个文件
- 一个 Web 用户控件
- Web 用户控件的代码隐藏文件
- 一个简单的类文件来存储数据
- 一个“控制器”类来连接数据库
安装
- 如果尚未安装 Visual Studio Express,请安装 (下载)
- 如果尚未安装 SQL Server Express,请安装 (下载)
- 请按照 此处的 说明安装 DotNetNuke Starter Kit 并创建 DotNetNuke 网站
- 在 Visual Studio 中,选择“生成”,然后选择“生成解决方案”。在继续之前,您必须能够无错误地生成它
准备好创建模块了吗?
您必须有一个正在运行的 DotNetNuke 4 网站才能继续。如果没有,您可以使用 此链接 和 此链接 来查找帮助。DotNetNuke 随着其发展而不断变化,因此获得最新帮助和信息的最佳方法是使用 DotNetNuke 消息板。
DAL 与 DAL+
摘自:“DotNetNuke 模块开发人员指南"。版权所有 © 2003-2005 Perpetual Motion Interactive Systems, Inc. 保留所有权利。
使用标准的 DotNetNuke 数据访问层 (DAL) 设计,我们将创建一个数据库提供程序类,该类与数据库通信并重写抽象类(数据提供程序)中的方法。该类位于数据库提供程序类和业务逻辑层 (BLL) 之间。这将允许我们替换备用数据库提供程序类以与其他数据库通信。
在本教程中,我们将演示 DAL+。DAL+ 是一种与数据库通信的替代方法。这种方法仍然允许我们与备用数据库通信,前提是 DotNetNuke 使用支持 DotNetNuke 4.1 或更高版本(或 DotNetNuke 3.3 或更高版本)的备用提供程序运行。
但是,与传统的 DAL 不同,DAL+ 并不是 100%“可移植”到其他数据源。它最适合用于不会分发到可能需要在 Microsoft SQL Server 以外的数据库上运行的其他 DotNetNuke 站点的模块。对于这些情况,最好使用 本教程 中描述的传统 DAL。
本教程涵盖的示例模块演示了您所需的大部分功能,包括:“Select”、“Delete”、“Update”和“Insert”。本教程还向您展示了如何使用对象数据源。使用本教程中的技术,您将节省大量在 ASP.NET 1.1 中编写完全相同的模块时不得不编写的代码。
设置模块
我们将通过以下步骤创建模块
- 创建 DAL+
- 创建“info 类”
- 创建“控制器类”
- 创建“View”控件
- 创建网格视图和表单视图
- 创建代码隐藏
- 创建表和存储过程
- 在 DotNetNuke 中注册模块
创建目录
在 Visual Studio 中打开您的 DotNetNuke 网站
DotNetNuke 模块驻留在两个目录中。Web 用户控件及其关联的代码隐藏文件驻留在“DesktopModules”目录中,所有其他代码(数据访问层和业务逻辑层代码)驻留在“App_Code”目录中。
创建 DAL+
首先,我们将使用 DAL+ 方法创建数据访问层。这是与数据库通信的类。
创建“info 类”
右键单击“App_Code”文件夹,然后选择“新建文件夹”。
将新文件夹命名为“ThingsForSale”
右键单击您刚刚创建的“ThingsForSale”文件夹,然后选择“添加新项”。
在打开的“添加新项”框中,在“Visual Studio 已安装模板”下单击“类”,在“名称”框中输入“ThingsForSaleInfo.vb”,然后单击“添加”按钮。
该类现在将在设计器中打开
将**所有**代码替换为以下代码
Namespace YourCompany.Modules.ThingsForSale
Public Class ThingsForSaleInfo
Private _ModuleId As Integer
Private _ID As Integer
Private _UserID As Integer
Private _Category As String
Private _Description As String
Private _Price As Double
' 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 UserID
' </summary>
Public Property UserID() As Integer
Get
Return _UserID
End Get
Set(ByVal value As Integer)
_UserID = value
End Set
End Property
' <summary>
' Gets and sets the Category
' </summary>
Public Property Category() As String
Get
Return _Category
End Get
Set(ByVal value As String)
_Category = value
End Set
End Property
' <summary>
' Gets and sets the Description
' </summary>
Public Property Description() As String
Get
Return _Description
End Get
Set(ByVal value As String)
_Description = value
End Set
End Property
' <summary>
' Gets and sets the Price
' </summary>
Public Property Price() As Double
Get
Return _Price
End Get
Set(ByVal value As Double)
_Price = value
End Set
End Property
End Class
End Namespace
我们刚刚做了什么?
我们创建了一个简单的类文件。此类实例化后,将成为一个对象,该对象将用于在我们正在构建的数据访问层和稍后将创建的 Web 用户控件之间传递数据。如果您不熟悉面向对象编程,**这里** 是一个很好的参考网站。
请注意,此类有一个属性对应于我们需要双向传输的每个数据字段。
创建“控制器类”
右键单击“ThingsForSale”文件夹,然后选择“添加新项”。
在打开的“添加新项”框中,在“Visual Studio 已安装模板”下单击“类”,在“名称”框中输入“ThingsForSaleController.vb”,然后单击“添加”按钮。
该类现在将在设计器中打开
将**所有**代码替换为以下代码
Imports System
Imports System.Collections.Generic
Imports System.Data
Namespace YourCompany.Modules.ThingsForSale
Public Class ThingsForSaleController
<DataObjectMethod(DataObjectMethodType.Insert)> _
Public Shared Sub ThingsForSale_Insert(ByVal _
ThingsForSaleInfo As ThingsForSaleInfo)
DataProvider.Instance().ExecuteNonQuery("ThingsForSale_Insert", _
ThingsForSaleInfo.ModuleId, GetNull(ThingsForSaleInfo.UserID), _
GetNull(ThingsForSaleInfo.Category.ToString), _
GetNull(ThingsForSaleInfo.Description.ToString), _
GetNull(ThingsForSaleInfo.Price))
End Sub
<DataObjectMethod(DataObjectMethodType.Delete)> _
Public Shared Sub ThingsForSale_Delete(ByVal _
ThingsForSaleInfo As ThingsForSaleInfo)
DataProvider.Instance().ExecuteNonQuery(_
"ThingsForSale_Delete", ThingsForSaleInfo.ID)
End Sub
<DataObjectMethod(DataObjectMethodType.Update)> _
Public Shared Sub ThingsForSale_Update(ByVal _
ThingsForSaleInfo As ThingsForSaleInfo)
DataProvider.Instance().ExecuteNonQuery("ThingsForSale_Update", _
ThingsForSaleInfo.ID, ThingsForSaleInfo.ModuleId, _
GetNull(ThingsForSaleInfo.UserID), _
GetNull(ThingsForSaleInfo.Category.ToString), _
GetNull(ThingsForSaleInfo.Description.ToString), _
GetNull(ThingsForSaleInfo.Price))
End Sub
<DataObjectMethod(DataObjectMethodType.Select)> _
Public Shared Function ThingsForSale_SelectAll(ByVal _
ModuleId As Integer) As List(Of ThingsForSaleInfo)
Return CBO.FillCollection(Of ThingsForSaleInfo)_
(CType(DataProvider.Instance().ExecuteReader(_
"ThingsForSale_SelectAll", ModuleId), IDataReader))
End Function
Private Shared Function GetNull(ByVal Field As Object) As Object
Return Null.GetNull(Field, DBNull.Value)
End Function
End Class
End Namespace
我们刚刚做了什么?
这次,我们做了很多工作。但是,我们是以很少的代码完成了大量工作。
我们构建了一个名为“ThingsForSaleController
”的类,该类具有四个公共方法。这些方法中的每一种都使用 DAL+ 的新方法之一来执行存储过程
我们还没有创建存储过程。我们将在稍后步骤中完成。现在,我们只是为我们将要与数据库执行的每个任务创建了一个方法
Delete
-ThingsForSale_Delete
Insert
-ThingsForSale_Insert
Select
-ThingsForSale_SelectAll
Update
-ThingsForSale_Update
注意:使用受保护的方法“GetNull
”来为任何可能为空的值将正确的值传递给数据库。
Delete
、Insert
和 Update
方法接受先前创建的“ThingsForSaleInfo
”类作为参数。
SelectAll
方法接受一个整数作为参数,并返回一个“ThingsForSaleInfo
”类。
DAL+ 由三个用于执行存储过程的方法组成。这些方法是
ExecuteNonQuery
- 用于执行不返回值的存储过程。ExecuteReader
- 用于执行返回多个记录的存储过程。ExecuteScalar
- 用于执行返回单个值的存储过程。
Delete
、Insert
和 Update
方法使用 DAL+ 的 ExecuteNonQuery
方法,而 SelectAll
方法使用 DAL+ 的 ExecuteReader
方法(本教程未使用 DAL+ 的 ExecuteScalar
方法)。
下面是对用于实现 DAL+ 的格式的解释。在“ThingsForSale_SelectAll
”方法中使用的 ExecuteReader
方法在此示例中使用
完成代码
记住,DotNetNuke 模块驻留在两个目录中
- Web 用户控件及其关联的代码隐藏文件驻留在“DesktopModules”目录中。
- 所有其他代码驻留在“App_Code”目录中。
我们已经在“App_Code”目录中创建了 DAL+ 代码。现在,我们将通过在“DesktopModules”目录中创建 Web 用户控件来完成模块。
创建目录
右键单击“DesktopModules”文件夹,然后选择“新建文件夹”。
将新文件夹命名为“ThingsForSale”。
创建“View”控件
右键单击您刚刚创建的“ThingsForSale”文件夹,然后选择“添加新项”。
在打开的“添加新项”框中
- 在“Visual Studio 已安装模板”下单击“Web 用户控件”。
- 在“名称”框中输入“ViewThingsForSale.ascx”。
- 确保选中“将代码放在单独的文件中”框。
- 单击“添加”按钮。
“ViewThingsForSale.ascx”文件将在“DesktopModules”文件夹下的“ThingsForSale”文件夹中创建。
单击文件旁边的“加号”图标将显示关联的代码隐藏文件“ViewThingsForSale.ascx.vb”。
创建网格视图和表单视图
双击“ViewThingsForSale.ascx”文件,它将在主编辑窗口中打开。目前页面将为空白。单击页面底部的“源”按钮切换到源视图。
将**所有**代码替换为以下代码
<%@ Control language="vb"
Inherits="YourCompany.Modules.ThingsForSale.ViewThingsForSale"
CodeFile="ViewThingsForSale.ascx.vb"
AutoEventWireup="false" Explicit="True" %>
<%@ Register Assembly="DotNetNuke.WebUtility"
Namespace="DotNetNuke.UI.Utilities" TagPrefix="cc1" %>
<%@ Register TagPrefix="dnn" TagName="Audit"
Src="~/controls/ModuleAuditControl.ascx" %> <br />
<asp:ObjectDataSource ID="ObjectDataSource_ThingsForSale"
runat="server"
DataObjectTypeName="YourCompany.Modules.ThingsForSale.ThingsForSaleInfo"
DeleteMethod="ThingsForSale_Delete"
InsertMethod="ThingsForSale_Insert"
OldValuesParameterFormatString="original_{0}"
OnInit="Page_Load" SelectMethod="ThingsForSale_SelectAll"
TypeName="YourCompany.Modules.ThingsForSale.ThingsForSaleController"
UpdateMethod="ThingsForSale_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_ThingsForSale"
DataKeyNames="ID,UserID,ModuleId" CellPadding="4"
CellSpacing="1" EnableViewState="False">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:BoundField DataField="UserID" HeaderText="UserID"
SortExpression="UserID" Visible="False" />
<asp:BoundField DataField="ModuleId"
HeaderText="ModuleId"
SortExpression="ModuleId" Visible="False" />
<asp:BoundField DataField="ID" HeaderText="ID"
SortExpression="ID" Visible="False" />
<asp:BoundField DataField="Category"
HeaderText="Category" SortExpression="Category" />
<asp:BoundField DataField="Price" HeaderText="Price"
SortExpression="Price"
DataFormatString="{0:c}" HtmlEncode="False" />
<asp:BoundField DataField="Description"
HeaderText="Description" SortExpression="Description" />
</Columns>
<EmptyDataTemplate>
There are no Things 4 Sale
</EmptyDataTemplate>
</asp:GridView>
<br />
<asp:LinkButton ID="Add_My_Listing_LinkButton" runat="server"
EnableViewState="False">Add My Listing</asp:LinkButton><br />
<br />
<asp:FormView ID="FormView1" runat="server" DataKeyNames="ID"
DataSourceID="ObjectDataSource_ThingsForSale"
DefaultMode="Insert" BorderColor="DarkGray"
BorderStyle="Solid" BorderWidth="1px" CellPadding="4" Visible="False">
<EditItemTemplate>
</EditItemTemplate>
<InsertItemTemplate>
Category: <asp:DropDownList ID="DropDownList1"
runat="server" DataSource='<%# Eval("Category") %>'
SelectedValue='<%# Bind("Category") %>'
EnableViewState="False">
<asp:ListItem>Home</asp:ListItem>
<asp:ListItem>Office</asp:ListItem>
<asp:ListItem>Electronics</asp:ListItem>
<asp:ListItem>Misc.</asp:ListItem>
</asp:DropDownList>
Price: $ <asp:TextBox ID="PriceTextBox" runat="server"
Text='<%# Bind("Price") %>'
Width="56px" CausesValidation="True"
EnableViewState="False">
</asp:TextBox><br />
<asp:RangeValidator ID="RangeValidator1" runat="server"
ControlToValidate="PriceTextBox"
ErrorMessage="Price must be greater than 0"
MaximumValue="99999" MinimumValue="1"></asp:RangeValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server" ControlToValidate="PriceTextBox"
ErrorMessage="A price is required"></asp:RequiredFieldValidator><br />
Description:<br />
<asp:TextBox ID="DescriptionTextBox" runat="server"
Text='<%# Bind("Description") %>' MaxLength="499"
TextMode="MultiLine" Width="286px"
EnableViewState="False"> </asp:TextBox><br />
<asp:LinkButton ID="InsertButton" runat="server"
CausesValidation="True" CommandName="Insert"
Text="Insert" OnClick="InsertButton_Click"></asp:LinkButton>
<asp:LinkButton ID="InsertCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel"
Text="Cancel" OnClick="InsertCancelButton_Click"></asp:LinkButton>
<asp:TextBox ID="ModuleIdTextBox" runat="server"
Text='<%# Bind("ModuleId") %>'
Width="14px" Visible="False"></asp:TextBox>
<asp:TextBox ID="IDTextBox" runat="server"
Text='<%# Bind("ID") %>' Width="13px"
Visible="False"></asp:TextBox>
<asp:TextBox ID="UserIDTextBox" runat="server"
Text='<%# Bind("UserID") %>' Width="10px"
Visible="False"></asp:TextBox>
</InsertItemTemplate>
<ItemTemplate>
</ItemTemplate>
</asp:FormView>
单击设计窗口底部的“设计”按钮,屏幕将如下所示
我们刚刚做了什么?
我们在页面上放置了四个控件
ObjectDataSource
- 这是右侧图像的顶部。它被标记为“
ObjectDataSource
”。此控件绑定到前面步骤中创建的“ThingsForSaleController
”类。
- 这是右侧图像的顶部。它被标记为“
GridView
- 此控件位于“
ObjectDataSource
”控件的正下方。此控件绑定到“ObjectDataSource
”控件,并配置为Select
、Update
和Delete
。
- 此控件位于“
LinkButton
- 这是一个简单的
LinkButton
,用于显示消息,并且当可单击时,将允许下面的FormView
控件显示。
- 这是一个简单的
FormView
- 此控件允许用户将项目添加到数据库。它也绑定到“
ObjectDataSource
”控件,并配置为Insert
。
- 此控件允许用户将项目添加到数据库。它也绑定到“
关于 ObjectDataSource 控件的更多信息
将鼠标悬停在“ObjectDataSource
”控件上,直到出现黑色小箭头。
单击它,将出现配置菜单。单击“配置数据源”。
“ThingsForSaleController
”类被配置为对象数据源。
单击“下一步 >”按钮。
下一个屏幕显示四个选项卡(Select、Update、Insert 和 Delete)。单击每个选项卡会显示“ThingsForSaleController
”类的不同方法被配置为处理每个功能。
单击“下一步 >”按钮。
最后一个屏幕显示传递给 Select
方法的参数的配置。在这里,我们指示“ModuleId
”的默认值为“00”。这只是一个“占位符”。实际值将在运行时由后续步骤中的代码提供。
在“ObjectDataSource
”控件的属性窗口中,我们看到“DataObjectTypeName
”设置为我们先前步骤中创建的“ThingsForSaleInfo
”类。
这就是我们指示该类将用于在“ObjectDataSource
”控件和“ThingsForSaleController
”类之间传递数据的方式。
创建代码隐藏
双击“ViewThingsForSale.ascx.vb”文件,使其在设计窗口中打开。
将**所有**代码替换为以下代码
Imports DotNetNuke
Imports System.Web.UI
Imports System.Collections.Generic
Imports System.Reflection
Imports DotNetNuke.Security.PortalSecurity
Namespace YourCompany.Modules.ThingsForSale
Partial Class ViewThingsForSale
Inherits Entities.Modules.PortalModuleBase
Dim ThingsForSaleInfo_data As New ThingsForSaleInfo
Protected Sub Page_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
If IsInRole("Registered Users") Or _
IsInRole("Administrators") Then
Add_My_Listing_LinkButton.Enabled = True
Else
Add_My_Listing_LinkButton.Text = _
"You must be logged in to add a Listing"
Add_My_Listing_LinkButton.Enabled = False
End If
End Sub
Protected Sub SetModuleId(ByVal sender As Object, ByVal e As _
System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs) _
Handles ObjectDataSource_ThingsForSale.Selecting
e.InputParameters("ModuleId") = ModuleId.ToString
End Sub
Protected Sub InsertingItem(ByVal sender As Object, ByVal e As _
System.Web.UI.WebControls.FormViewInsertEventArgs) _
Handles FormView1.ItemInserting
e.Values.Item("UserID") = _
Entities.Users.UserController.GetCurrentUserInfo.UserID
e.Values.Item("ModuleId") = ModuleId.ToString()
e.Values.Item("ID") = 0
End Sub
Protected Sub InsertCancelButton_Click(ByVal sender _
As Object, ByVal e As System.EventArgs)
Me.FormView1.Visible = False
End Sub
Protected Sub Add_My_Listing_LinkButton_Click(ByVal sender _
As Object, ByVal e As System.EventArgs) _
Handles Add_My_Listing_LinkButton.Click
Me.FormView1.Visible = True
End Sub
Protected Sub InsertButton_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Me.FormView1.Visible = False
Add_My_Listing_LinkButton.Text = _
"Update Successful - Add Another Listing"
End Sub
Protected Sub HideEditButtons(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
ThingsForSaleInfo_data = CType(e.Row.DataItem, _
ThingsForSaleInfo)
If IsInRole("Administrators") Or _
(Entities.Users.UserController.GetCurrentUserInfo.UserID _
= CInt(ThingsForSaleInfo_data.UserID)) Then
e.Row.Cells.Item(0).Enabled = True
Else
e.Row.Cells.Item(0).Text = " "
End If
End If
End Sub
End Class
End Namespace
我们刚刚做了什么?
我们输入了处理以下代码的代码
- 仅允许注册用户或管理员添加条目(
IsInRole("Registered Users") Or IsInRole("Administrators")
) - 仅允许用户编辑自己的条目(
Entities.Users.UserController.GetCurrentUserInfo.UserID = CInt(ThingsForSaleInfo_data.UserID
) - 将当前的“
ModuleId
”注入“ObjectDataSource
”控件。
希望这能帮助那些在 DotNetNuke 中使用对象数据源的人。存在获取当前“ModuleId
”的问题。
这是一个由 DotNetNuke 核心代码公开的非常重要的值。该值告诉您您正在处理模块的哪个实例。这很重要,因为用户可以在单个页面上放置多个模块实例。您不能让用户单击一个模块的按钮,却返回另一个模块的数据。
您可以在“ViewThingsForSale.ascx”和“ViewThingsForSale.ascx.vb”中看到解决方案。在“ViewThingsForSale.ascx”文件中,在“ObjectDataSource
”控件中,我们将“ModuleId
”参数指定为传递给“Select
”方法的“Select”参数
在“ViewThingsForSale.ascx.vb”中,我们有
Protected Sub SetModuleId(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs) _
Handles ObjectDataSource_ThingsForSale.Selecting
e.InputParameters("ModuleId") = ModuleId.ToString
End Sub
当“ObjectDataSource
”控件中的“Select
”事件被调用时,但在控件将值传递给“ThingsForSaleController
”类中的“SelectAll
”方法之前,此事件将被触发。这允许您将“ModuleId
”传递给“ThingsForSaleController
”类(并传递给“ThingsForSale_SelectAll
”存储过程,以便它返回正确的数据)。
编译和构建模块
从工具栏中,选择“生成”,然后选择“生成解决方案”。
站点应无错误地生成。
在解决方案资源管理器中,右键单击“Default.aspx”页面,然后选择设置为启动页。
从工具栏中,选择 调试,然后选择 开始但不调试。
网站现在应该会显示
如果遇到问题,请从本文顶部链接下载代码,并与您的代码进行比较。
请记住:**模块尚未工作,因为表和存储过程尚未创建**。但是,代码在此阶段仍应能编译。
完成代码
在上一步中,您应该已经在网页浏览器中打开了您的 DotNetNuke 网站。
点击登录。
以“host”身份登录。密码(如果您尚未更改)为“dnnhost”。
创建表和存储过程
点击Host菜单,然后选择SQL。
将以下脚本粘贴到框中
/** Create Table **/
CREATE TABLE {databaseOwner}[{objectQualifier}ThingsForSale] (
[ID] [int] IDENTITY(1,1) NOT NULL,
[ModuleId] [int] NOT NULL,
[UserID] [int] NULL,
[Category] [nvarchar](25),
[Description] [nvarchar](500),
[Price] [float] NULL
) ON [PRIMARY]
ALTER TABLE {databaseOwner}[ThingsForSale] ADD
CONSTRAINT [PK_{objectQualifier}ThingsForSale] PRIMARY KEY CLUSTERED
([ID]) ON [PRIMARY]
GO
/** Create Stored Procedures **/
CREATE PROCEDURE {databaseOwner}[{objectQualifier}ThingsForSale_Delete]
@ID int
AS
DELETE FROM {objectQualifier}ThingsForSale
WHERE (ID = @ID)
RETURN
GO
CREATE PROCEDURE {databaseOwner}[{objectQualifier}ThingsForSale_Insert]
@ModuleId int,
@UserID int,
@Category nvarchar(25),
@Description nvarchar(500),
@Price float
AS
INSERT INTO {objectQualifier}ThingsForSale
(ModuleId, UserID, Category, Description, Price)
VALUES (@ModuleId,@UserID,@Category,@Description,@Price)
RETURN
GO
CREATE PROCEDURE {databaseOwner}[{objectQualifier}ThingsForSale_SelectAll]
@ModuleId int
AS
SELECT ID, ModuleId, UserID, Category, Description, Price
FROM {objectQualifier}ThingsForSale
WHERE (ModuleId = @ModuleId)
ORDER BY Category
RETURN
GO
CREATE PROCEDURE {databaseOwner}[{objectQualifier}ThingsForSale_Update]
@ID int,
@ModuleId int,
@UserID int,
@Category nvarchar(25),
@Description nvarchar(500),
@Price float
AS
UPDATE {objectQualifier}ThingsForSale
SET ModuleId = @ModuleId, UserID = @UserID, Category = @Category,
Description = @Description, Price = @Price
WHERE (ID = @ID)
RETURN
GO
勾选“作为脚本运行”框,然后单击“执行”。
请注意您网页浏览器中的进度条,因为脚本运行完毕后,窗口中的文本会移动,然后……什么也没有。也许有一天我们会收到“完成”的消息 :)。
我们刚刚做了什么?
我们运行了一个 SQL 脚本,该脚本创建了表和存储过程。
您会注意到脚本的写法如下
CREATE TABLE {databaseOwner}[{objectQualifier}ThingsForSale]
而不是标准的
CREATE TABLE [dbo][ThingsForSale]
脚本命令“{databaseOwner}
”和“{objectQualifier}
”表明它们将由 web.config 文件中的配置设置替换。通常,“{databaseOwner}
”设置为“.dbo”,而“{objectQualifier}
”则不设置(它没有设置)。但是,如果在 web.config 文件中指定了备用设置,则这些设置将被插入到脚本中。
您必须选中“作为脚本运行”框才能使此替换发生。
在 DotNetNuke 中注册模块
在网页浏览器中以“host”身份登录您的 DotNetNuke 站点时,从菜单栏中选择“Host”。然后选择“Module Definitions”。
单击向下指向的黑色箭头,以弹出菜单。在该菜单上,选择“Add New Module Definition”。
在Edit Module Definitions 菜单中
- 在 Module Name 中输入“ThingsForSale”
- 在 Folder Title 中输入“ThingsForSale”
- 在 Friendly Title 中输入“ThingsForSale”
- 在 Description 中输入“ThingsForSale”
- 在 Version 中输入“1.0”
然后单击 Update。
在 New Definition 中输入“ThingsForSale”。
然后单击“Add”。
接下来,单击“Add Control”。
在Edit Module Control 菜单中
- 在 Title 中输入“ThingsForSale”。
- 使用下拉菜单为 Source 选择“DesktopModule/ThingsForSale/ViewThingsForSale.ascx”。
- 使用下拉菜单为 Type 选择“View”。
然后单击 Update。
在网站的左上角,在Page Functions 菜单下,单击Add。
在Page Management 菜单中,在 Page Details 下
- 在 Page Name 中输入“ThingsForSale”
- 在 Page Title 中输入“ThingsForSale”
- 在 Description 中输入“ThingsForSale”
- 在 All Users 旁边的View Page 框中单击
然后单击 Update。
从 Module 下拉菜单中,选择“ThingsForSale”。
然后单击Add。
模块现在将出现。
我们刚刚做了什么?
我们已经创建了一个模块定义并将模块添加到了页面