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

使用 LINQ to SQL 创建 DotNetNuke® 模块

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2007 年 12 月 25 日

BSD

10分钟阅读

viewsIcon

110506

downloadIcon

351

本教程将向您展示如何使用 LINQ to SQL 创建 DotNetNuke 模块。

要学习本教程,您需要

  1. Visual Studio Visual Web Developer Express 2008 (下载) 或 Visual Studio 2008
  2. DotNetNuke (下载)
  3. ASP.NET 3.5 (或更高版本) (下载)

本教程将向您展示如何使用 LINQ to SQL 创建 DotNetNuke 模块。这将大大加快模块的开发速度。

另请参阅

使用 LINQ to SQL 创建 DotNetNuke 模块 (第二部分)

设置

请按照以下选项之一安装 DotNetNuke 并创建 DotNetNuke 网站
  • 设置开发环境 (使用 IIS)
  • 设置开发环境 (不使用 IIS)
  • 在 Windows Vista 上设置开发环境 (使用 IIS)

    如果您还没有安装 Visual Studio Express 2008,请安装它。( 下载)

    使用 Visual Studio 2008 打开 DotNetNuke

    如果您使用的是 DotNetNuke 4.7 或更低版本,您将收到类似以下的提示信息

    点击“是”。这将为 web.config 文件添加必要的更改,以允许 LINQ to SQL 运行。

    在 Visual Studio 中,选择“生成”然后选择“生成解决方案”。在继续之前,您必须能够无错误地生成它。警告是可以的。

    准备好创建模块了吗?

    您必须有一个正常运行的 DotNetNuke 4 网站才能继续。如果您没有,可以使用 此链接此链接 来查找帮助。

    随着 DotNetNuke 的不断发展,它也在不断变化,因此获取最新帮助和信息的最佳方式是使用 DotNetNuke 论坛

    创建表

    使用 Host 账户登录网站。

    点击 HOST 菜单并选择 SQL

    将以下脚本粘贴到框中

    CREATE TABLE 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 ThingsForSale ADD
    CONSTRAINT [PK_ThingsForSale] PRIMARY KEY CLUSTERED
    ([ID]) ON [PRIMARY]     
    
            
    

    勾选“作为脚本运行”框并点击“执行”。

    设置模块

    如果您还没有在 Visual Studio (或 Visual Web Developer Express) 中打开 DotNetNuke 网站,请选择 文件,然后选择 打开网站

    选择 DotNetNuke 网站的根目录,然后点击 打开 按钮。

    右键单击 App_Code 文件夹并选择 新建文件夹

    将文件夹命名为 LinqThings4Sale

    解决方案资源管理器 中,双击 web.config 文件以将其打开。

    web.config 文件中添加以下行

    <add directoryName="LinqThings4Sale" />

    <codeSubDirectories> 部分。这样做是为了指示 ASP.NET 此处将创建非 VB.NET 语言的代码(VB.NET 是 DotNetNuke 主项目使用的语言)。

    右键单击 App_Code 文件夹并选择 刷新文件夹

    LinqThings4Sale 文件夹的图标现在将发生变化,表明该文件夹已被识别为一个特殊文件夹。

    创建 LINQ to SQL 类

    右键单击 App_Code 文件夹下的 LinqThings4Sale 目录,然后选择 添加新项

    添加新项 窗口中,选择 LINQ to SQL Classes 模板,输入 LinqThings4Sale.dbml 作为 名称,并选择 Visual C# 作为 语言。点击 添加 按钮。

    稍等片刻,对象关系设计器 将在编辑窗口中打开。

    从工具栏中,选择 视图,然后选择 服务器资源管理器

    服务器资源管理器 中,右键单击根节点 (数据连接) 并选择 添加连接

    输入连接 DotNetNuke 网站运行所使用的数据库的信息。

    不是模块运行时将使用的连接(您将在后续步骤中设置该连接)。这仅是为了允许您使用 对象关系设计器。点击 确定 按钮。

    当连接显示在 服务器资源管理器 中时,点击加号图标展开其对象树以显示表。

    找到 ThingsForSale 表。

    点击它并将其拖放到左侧的 对象关系设计器 面板上。

    点击 对象关系设计器 面板上的任意空白区域,以便 LinqThings4SaleDataContext 的属性显示在 属性 窗口中(您也可以从属性窗口中的下拉列表中选择它)。

    连接 下拉列表中选择 SiteSqlServer (Web.config)。这将指示该类使用 DotNetNuke 网站的连接字符串。

    连接属性应与右侧的图形相似。

    关闭 LinqThings4Sale.dbl 文件。您应该会看到一个确认屏幕,询问您是否保存。点击 按钮。

    数据访问层现已完成。

    创建模块

    解决方案资源管理器 中,右键单击 DesktopModules 文件夹并选择 新建文件夹

    将文件夹命名为 LinqThings4Sale


    右键单击 LinqThings4Sale 文件夹并选择 添加新项



    添加新项 框中,选择 Web 用户控件 模板,输入 View.ascx 作为 名称,选择 Visual C# 作为 语言,并勾选 将代码放在单独的文件中 复选框。

    View.ascx 页面打开时,切换到源代码视图并找到 Inherits 行。

    将其更改为

    DotNetNuke.Modules.LinqThings4Sale.View

    保存文件。

    解决方案资源管理器 中 (在 LinqThings4Sale 目录下方),点击 View.ascx 文件旁边的加号图标,然后双击 View.ascx.cs 文件将其打开。


    用以下代码替换所有代码

    using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    
    using DotNetNuke;
    using DotNetNuke.Security;
    using LinqThings4Sale;
    
    namespace DotNetNuke.Modules.LinqThings4Sale
    {
    public partial class View : DotNetNuke.Entities.Modules.PortalModuleBase
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    
    }
    }
    }

    保存文件。从 工具栏 中,选择 生成,然后选择 生成页面。页面应能无错误地生成。

    切换到 View.ascx 文件,并切换到 设计 视图。从 工具箱数据 部分,选择 LinqDataSource 控件。

    LinqDataSource 控件拖到 View.ascx 页面的设计图面上。点击选项 (控件右侧的右箭头),然后选择 配置数据源

    配置数据源 框中,在下拉列表中选择 LinqThings4Sale.LinqThings4SaleDataContext,然后点击 下一步 按钮。

    将显示 配置数据选择 屏幕。保留默认选项。

    点击 Where 按钮。

    配置 Where 表达式 屏幕上

    • 下拉列表中选择 ModuleId
    • 运算符 下拉列表中选择 = =
    • 下拉列表中选择 None

    点击 添加 按钮。

    这指示 LinqDataSource 控件按 ModuleId 过滤结果。每个新模块实例都有一个不同的 ModuleId。我们将在后续步骤中的代码隐藏中将此 ModuleId 传递给 LinqDataSource 控件。 点击 确定 按钮。

    点击 完成 按钮。

    LinqDataSource 控件的选项中,勾选 启用删除启用插入启用更新 复选框。

    从工具箱中拖动一个 GiridView 控件并将其放置在 LinqDataSource 控件下方。在 GridView 控件的选项中,从 选择数据源 下拉列表中选择 LinqDataSource1

    GridView 将绑定到数据源并为表中的字段创建列。

    GridView 控件的选项中,勾选 启用分页启用排序启用编辑启用删除 复选框。

    GridView 控件的选项中,点击 编辑列 链接。

    选定字段 部分选择 ID 列,然后在 BoundField 属性部分,将 可见 更改为 False。对 ModuleIdUserID 字段执行相同操作。点击 确定 按钮。

    GridView 现在将类似于右侧的图像。

    将一个 FormView 控件拖到设计图面上,并将其放置在 GridView 下方几个位置 (您将在后续步骤中在它们之间放置一个 LinkButton 控件)。

    FormView 控件的选项中,从 选择数据源 下拉列表中选择 LinqDataSource1。点击 编辑模板 链接。

    FormView 控件的选项中,在 显示 下拉列表中选择 InsertItem Template

    drop-down.

    切换到源代码视图,并将 InsertItemTemplate 部分替换为以下代码

    <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>
    </InsertItemTemplate>

    切换到设计视图,选择 编辑模板,然后选择 InsertItem Template,表单将类似于右侧的图像。

    FormView 控件的选项中,点击 结束模板编辑

    FormView属性 中,将 默认模式 设置为 插入

    同样,在 FormView属性 中,将 可见 设置为 False

    工具箱 中,点击 LinkButton 控件。

    将控件拖到设计图面上,并将其放置在 GridViewFormView 之间。

    LinkButton 的属性中 (如果您难以选择属性,请切换到源代码视图并双击 "<asp:LinkButton"),将 文本 设置为 添加我的列表

    创建代码隐藏

    View.ascx 文件现在应类似于右侧的图像。现在需要几个代码隐藏方法来完成模块。

    LinqDataSource 控件的代码隐藏

    我们希望修改 LinqDataSource 控件的行为,使其仅显示特定模块实例的记录。此外,在插入记录时,我们希望插入当前的 ModuleId 和当前的 UserID。右键单击 LinqDataSource 控件并选择 属性。属性将显示在 属性 窗口中 (如果未显示,请切换到源代码视图并点击 "<asp:LinqDataSource")。

    点击黄色的“闪电”图标切换到控件的“事件

    Inserted 行键入 LinqDataSource1_Inserted 并点击其他地方 (或者您可以直接在框中双击,名称会自动插入)。

    方法将被自动“连接”。

    添加代码使方法如下所示

    protected void LinqDataSource1_Inserted(object sender, 
    LinqDataSourceStatusEventArgs e)
    
    {
    this.GridView1.DataBind();
    }        

    (此方法指示 GridView 在记录插入后刷新自身)Inserting 行键入 LinqDataSource1_Inserting 并点击其他地方。

    添加代码使方法如下所示

    protected void LinqDataSource1_Inserting(object sender, LinqDataSourceInsertEventArgs e)
    {
    ThingsForSale ThingsForSale = (ThingsForSale)e.NewObject;
    
    ThingsForSale.UserID = Entities.Users.UserController.GetCurrentUserInfo().UserID;
    ThingsForSale.ModuleId = ModuleId;
    }

    (此方法将 "e",即即将插入的数据对象,强制转换为 ThingsForSale 对象。然后设置 UserID 和 ModuleId。)Selecting 行键入 LinqDataSource1_Selecting 并点击其他地方。

    添加代码使方法如下所示

    protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
    e.WhereParameters["ModuleId"] = ModuleId;
    }
    (此方法将当前的 ModuleId 传递给 LinqDataSource 控件。您可能还记得,已定义了一个 where 子句来期望传递一个 ModuleId。)

    “添加我的列表”链接的代码隐藏

    双击 添加我的列表 链接。

    添加代码使方法如下所示

    protected void LinkButton1_Click(object sender, EventArgs e)
    {
    this.FormView1.Visible = true;
    this.GridView1.DataBind();
    }
    (此方法使输入表单可见。)

    GridView 的代码隐藏

    右键单击 GridView 控件并选择 属性。属性将显示在 属性 窗口中 (如果未显示,请切换到源代码视图并点击 "<asp:GridView")。切换到事件,在 RowDataBound 行输入 GridView1_RowDataBound 并点击其他地方。

    添加代码使方法如下所示

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
    if ((e.Row.RowType == DataControlRowType.DataRow))
    {
    ThingsForSale ThingsForSale = ((ThingsForSale)(e.Row.DataItem));
    
    if ((PortalSecurity.IsInRole("Administrators"))
    || (Entities.Users.UserController.GetCurrentUserInfo().UserID == (int)ThingsForSale.UserID))
    {
    e.Row.Cells[0].Enabled = true;
    }
    else
    {
    e.Row.Cells[0].Text = " ";
    }
    }
    }        
    (此方法将 "e",即包含当前行数据的对象,强制转换为 ThingsForSale 对象。然后将 UserID 与当前用户的 UserID 进行比较。如果 UserID 与当前用户匹配,或者当前用户是管理员,则启用 GridView 上的第一列 (这允许用户编辑行)。)

    向代码隐藏添加其他方法

    将这两个方法添加到代码隐藏中
    protected void InsertButton_Click(object sender, EventArgs e)
    {
    this.FormView1.Visible = false;
    LinkButton1.Text = "Update Successful - Add Another Listing";
    this.GridView1.DataBind();
    }
    
    protected void InsertCancelButton_Click(object sender, EventArgs e)
    {
    this.FormView1.Visible = false;
    this.GridView1.DataBind();
    }
    (这些方法的事件已在前面步骤粘贴代码时创建) 修改代码隐藏中的 Page_Load 方法,使其如下所示
    protected void Page_Load(object sender, EventArgs e)
    {
    
    if ((PortalSecurity.IsInRole("Registered Users") || PortalSecurity.IsInRole("Administrators")))
    {
    LinkButton1.Enabled = true;
    }
    else
    {
    LinkButton1.Text = "You must be logged in to add a Listing";
    LinkButton1.Enabled = false;
    }
    }
    (此代码确定用户是否已登录,并显示“添加列表”链接 (如果已登录)。)

    保存文件。从 工具栏 中,选择 生成,然后选择 生成页面。页面应能无错误地生成。

    创建模块定义

    在登录到 DotNetNuke 网站并以“host”身份登录后,在网页浏览器中,从菜单栏选择“Host”。然后选择“Module Definitions”。

    点击向下的黑色箭头,使弹出菜单出现。在该菜单中选择“Create Module Definition”。

    Edit Module Definitions 菜单中

    • MODULE NAME 输入“LinqThings4Sale”
    • FOLDER TITLE 输入“LinqThings4Sale”
    • FRIENDLY NAME 输入“LinqThings4Sale”
    • DESCRIPTION 输入“LinqThings4Sale”
    • VERSION 输入“01.00.00”

    然后点击 UPDATE

    NEW DEFINITION 输入“LinqThings4Sale”,然后点击“Add Definition

    接下来,点击“Add Control

    Edit Module Control 菜单中

    • TITLE 输入“LinqThings4Sale”
    • 使用下拉列表选择“DesktopModules/LinqThings4Sale/View.ascx”作为 SOURCE
    • 使用下拉列表选择“View”作为 TYPE

    然后点击 UPDATE

    在网站左上角的 PAGE FUNCTIONS 菜单下点击 ADD

    PAGE MANAGEMENT 菜单的 PAGE DETAILS

    • PAGE NAME 输入“LinqThings4Sale”
    • PAGE TITLE 输入“LinqThings4Sale”
    • DESCRIPTION 输入“LinqThings4Sale”
    • 点击 ALL USERS 旁边的 VIEW PAGE 框。

    然后点击 UPDATE

    MODULE 下拉列表中选择“LinqThings4Sale”。

    然后点击 ADD

    现在模块将显示出来。

    教程完成。

    注意: 要在另一个 DotNetNuke 网站上运行此模块,您需要在服务器上安装 ASP.NET 3.5 并修改 DotNetNuke 网站的 web.config 文件

    更改: 将 <system.codedom> 部分更改为

    <system.codedom>
    <compilers>
    <compiler language="vb;vbs;visualbasic;vbscript" type="Microsoft.VisualBasic.VBCodeProvider, System,
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" extension=".vb" warningLevel="4">
    <providerOption name="CompilerVersion" value="v3.5"/>
    <providerOption name="OptionInfer" value="true"/>
    <providerOption name="WarnAsError" value="false"/>
    </compiler>
    <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
    <providerOption name="CompilerVersion" value="v3.5"/>
    <providerOption name="WarnAsError" value="false"/>
    </compiler>
    </compilers>
    </system.codedom>
  • 更改: 将 <assemblies> 部分更改为
    <assemblies>
    <add assembly="Microsoft.VisualBasic, 
    Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
    <add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
    <add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
    <add assembly="System.Management, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
    <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
    <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </assemblies> 
  • © . All rights reserved.