65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (18投票s)

2006年6月28日

BSD

13分钟阅读

viewsIcon

146101

downloadIcon

785

本教程将向您展示如何使用新的 DAL+(DotNetNuke 数据访问层的扩展功能集)来创建 DotNetNuke 模块。

引言

假设您的老板刚刚交给您一项任务,为运行 DotNetNuke 的公司内部网创建一个“交易站”类型的模块。过去,您可能需要花费将近半小时来设置开发环境,以及花费数小时来创建数据访问层 (DAL) 和代码。

随着 DotNetNuke 和 DAL 的最新增强功能,DAL+ 的创建已经改变了这一切。

本教程将向您展示如何使用新的 DAL+(DotNetNuke 数据访问层 (DAL) 的扩展功能集)来创建 DotNetNuke 模块。

您将需要什么

要使用本教程,您需要

  1. Visual Studio Express (下载)
  2. SQL Server Express (下载)
  3. DotNetNuke Starter Kit 4.x (下载) (注意:下载时,文件扩展名可能会变为“.zip”。下载后,将其更改为“.vsi”,然后双击该文件即可安装模板。)

模块

本教程的目标是展示 DotNetNuke 模块开发现在是如何变得超快速、超简单的。示例模块仅包含四个文件

  • 一个 Web 用户控件
  • Web 用户控件的代码隐藏文件
  • 一个简单的类文件来存储数据
  • 一个“控制器”类来连接数据库

安装

  1. 如果尚未安装 Visual Studio Express,请安装 (下载)
  2. 如果尚未安装 SQL Server Express,请安装 (下载)
  3. 请按照 此处的 说明安装 DotNetNuke Starter Kit 并创建 DotNetNuke 网站
  4. 在 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”来为任何可能为空的值将正确的值传递给数据库。

DeleteInsertUpdate 方法接受先前创建的“ThingsForSaleInfo”类作为参数。

SelectAll 方法接受一个整数作为参数,并返回一个“ThingsForSaleInfo”类。

DAL+ 由三个用于执行存储过程的方法组成。这些方法是

  • ExecuteNonQuery - 用于执行不返回值的存储过程。
  • ExecuteReader - 用于执行返回多个记录的存储过程。
  • ExecuteScalar - 用于执行返回单个值的存储过程。

DeleteInsertUpdate 方法使用 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”控件,并配置为 SelectUpdateDelete
  • 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 = "&nbsp;"
                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

模块现在将出现。

我们刚刚做了什么?

我们已经创建了一个模块定义并将模块添加到了页面

© . All rights reserved.